trait A { open fun foo(t: T) = "A" } trait B : A enum class Z(val name: String) : B { Z1 : Z("Z1") Z2 : Z("Z2") override fun foo(t: String) = name } fun box(): String { return when { Z.Z1.foo("") != "Z1" -> "Fail #1" Z.Z2.foo("") != "Z2" -> "Fail #2" (Z.Z1 : B).foo("") != "Z1" -> "Fail #3" (Z.Z2 : B).foo("") != "Z2" -> "Fail #4" (Z.Z1 : A).foo("") != "Z1" -> "Fail #5" (Z.Z2 : A).foo("") != "Z2" -> "Fail #6" else -> "OK" } }