I would just prefer to use the more specific type as documentation/enforcement of what sort of type is expected at those places.

I think you can get the `TypeRef` out of `ClassTypeParameter` by changing the parameter type of `unapply`.

```scala
scala> trait A; class B extends A; object E { def unapply(t: B) = Some((1, 2)) }
defined trait A
defined class B
defined module E

scala> def foo(a: A) = a match { case b @ E(_, _) => b; case _ => null }
foo: (a: A)B
```

Resuming a moderate level of typed extractor usage is an important milestone in the long rehabilitation process from SI-1697.