It seems to me that as long as you are fine with EXPLICIT vs. implicit then you can basically do it now like this:
val String.monoid get() = object : Monoid<String> {
override fun zero() = ""
override fun append( a1: String, a2: String) = a1 + a2
}
Then you can just do MyString.monoid to explicitly convert to a monoid.
If you want implicit conversion aren’t you then moving to morass of implicit conversion that lead IntelliJ to reject Scala and create Kotlin to begin with?