trait A { implicit def toB: B } sealed trait B case class B1() extends B case class B2() extends B object Main { implicit class AOps(a: A) { implicit def toB: B = a.toB } val a: A = new A() { override implicit def toB: B = B2() } // How to make the following to compile without change? val name: String = a match { case B1() => "B1" case B2() => "B2" } }