I'll bet that contributes to unwanted widening in extractor calls in pattern matching, too.

```
class ExtractorCallProd(
      ...
      // to which type should the previous binder be casted?
      def paramType  = constructorTp.finalResultType
      def resultType = fun.tpe.finalResultType
```

I was testing out variations of your pattern matcher patch with:

```scala
object Test {
  // Has never worked, but seems desirable given the recent changes to
  // pattern type inference.
  val a = ""
  object Id {
    def unapply(xxxx: Any): Some[a.type] = Some[a.type](a)
  }
  val b: a.type = (a: a.type) match {
    case Id(x) => x
  }
}
```