final case class Recovered(x: Int, s: String) final class Recovered2(val x: Int, val s: String) object Recovered2 { def unapply(x: Recovered2): Some[(Int, String)] = Some((x.x, x.s)) } object Main { def main(x: Any): Unit = { x match { case r: Recovered => "case 1" case r: Recovered2 => "case 2" } } }