According to JetBrains:
The recommended practice is to never use object for creating namespaces, and to always use top-level declarations when possible. We haven’t found name conflicts to be an issue, and if you do get a conflict, you can resolve it using an import with alias.
So based on that the answer to your initial question
When I should prefer top-level const [...]?
is always.
This is, however, a recommendation and in the end it's up to you how you want to organize your code and make use of the code completion feature in the IDE. Sometimes it's just better not to pollute your global namespace for the autocompletion sake. Since this problem/question has been widely discussed through many threads (e.g. here or here) and I'd say it heavily depends on one's preferences, I'll leave it here.
If you'd like to know what is happening under the hood, though, from bytecode perspective there is a slight difference between two approaches. Both top-level or (companion) object constants end up as static members of some class, but the object approach additionally creates a static INSTANCE
field that holds the object's reference. Memory wise this shouldn't make much difference, but it's good to be aware of it.