Note you can do this:
// module 1
interface BaseAnimal {
val name: String
}
sealed interface Animal : BaseAnimal
// module 2
abstract class MyAnimal internal constructor() : BaseAnimal { ... }
data class MyCat(override val name: String) : MyAnimal(), Cat { ... }
Not ideal, but works.