trait A { open fun foo(t: T) = "A" } enum class Z(val name: String) : A { 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 : A).foo("") != "Z1" -> "Fail #3" (Z.Z2 : A).foo("") != "Z2" -> "Fail #4" else -> "OK" } }