o:test() -- method call. equivalent to o.test(o) o.test() -- regular function call. similar to just test() o.x = 5 -- field access
Details on the behavior is discussed in PIL .
It can be said that accessing fields and performing method calls are semantically different and warrant the difference in notation provided in Lua. Invoking a method is like passing a message to an object.
See PIL  for an example of using closures so that method calls may use the "." syntax. Creating many such closures could be inefficient. More info on this at ObjectBenchmarkTests.
See also the [__methindex] proposal, which distinguishes ':' and '.' with different metamethods. It can rely on the fact that even though ':' is syntactic sugar for '.', they do produce different VM opcodes (the former generates a SELF opcode).