I agree with using extension functions (in most cases 😉).
In my experience, those static utility class functions usually have one major purpose: providing functionality you wished was already present in the class, but it's missing so you implement it yourself. Extension functions are perfect for "pretending" the class has this functionality.
On the technical side: When compiling for JVM, top-level-(extension-)functions will be compiled to simple static functions with an added parameter for the receiver.
In some cases you need utility functions that don't make sense as extensions but would be better implemented as normal functions. Here - again - it depends, but esp. if the input parameters are something common like primitive types, I prefer putting functions like that into an
object
to provide more context on the call side.