Here's a more detailed list, for the curious:
- Changes since Lua 5.3: https://www.lua.org/work/doc/#changes
- Incompatibilities with the Previous Version: https://www.lua.org/work/doc/manual.html#8
Ability to store multiple values (uservalues) with a userdata. Since Lua 5.2 one has always been able to store a single uservalue, which could be a table storing as many items as you wanted. Lua 5.1 had the concept of environments, which had the same role as uservalues for userdata types.
Being able to store multiple uservalues with a userdata type is quite convenient and cuts down on garbage objects (i.e. table container). Also mirrors the ability to set multiple upvalues for functions.
These are the kinds of features that really make Lua shine in terms of embedding and extension. Lua has rich interfaces for efficiently and conveniently associating native (e.g. C) objects with Lua objects and vice-versa. Other languages are rife with hacks as they only provide the simplest such mechanisms, if at all.
By contrast, the new warning API seems dubious. It's a great idea conceptually but logging is the sort of interface that generates a ton of friction in terms of composability and integration. It's impossible to please even a substantial minority of people. That said, I already have ideas for how to use it.