Tipo dependiente de la ruta dentro del valor de la clase en Scala

Me gustaría dar un valor de un tipo con un tipo abstracto a una clase y luego usar su tipo dependiente de la ruta. Mira el siguiente ejemplo (usando Scala 2.10.1):

trait Foo {
  type A
  def makeA: A
  def useA(a: A): Unit
}

object Test {

  class IntFoo extends Foo {
    type A = Int
    def makeA = 1
    def useA(a: Int) = println(a)
  }

  class FooWrap(val a: Foo) {
    def wrapUse(v: a.A) = a.useA(v)
  }

  val foo = new IntFoo

  /* Path dependent locally */
  val bar = foo  
  bar.useA(foo.makeA)   // works

  /* Path dependent through class value */
  val fooWrap = new FooWrap(foo)

  fooWrap.a.useA(foo.makeA)  // fails
  // error: type mismatch; found : Int required: Test.fooWrap.a.A

  fooWrap.wrapUse(foo.makeA) // fails
  // error: type mismatch; found : Int required: Test.fooWrap.a.A

}

En primer lugar, no entiendo la diferencia fundamental entre el caso local y el valor de clase (tenga en cuenta el valor público, inmutable) y por qué falla la verificación de tipo (porque obviamenteTest.fooWrap.a.A =:= foo.A). ¿Es esta una limitación del compilador de Scala?

Segundo, ¿cómo puedo lograr lo que estoy tratando de hacer?

ACTUALIZAR

Parece que esto se puede lograr mediante el uso de genéricos y restricciones de tipo en línea:

class FooWrap[T](val a: Foo { type A = T }) {
  def wrapUse(v: T) = a.useA(v)
}

Sin embargo, en mi caso,A es en realidad un tipo de tipo superior, por lo que el ejemplo se convierte en:

trait Foo {
  type A[T]
  def makeA[T]: A[T]
  def useA(a: A[_]): Unit
}

object Test {

  class OptFoo extends Foo {
    type A[T] = Option[T]
    def makeA[T] = None
    def useA(a: A[_]) = println(a.get)
  }

  class FooWrap(val a: Foo) {
    def wrapUse(v: a.A[_]) = a.useA(v)
  }

  val foo = new OptFoo

  /* Path dependent locally (snip) */

  /* Path dependent through class value */
  val fooWrap = new FooWrap(foo)

  fooWrap.a.useA(foo.makeA)  // fails
  // polymorphic expression cannot be instantiated to expected type;
  // found : [T]None.type required: Test.fooWrap.a.A[_]

  fooWrap.wrapUse(foo.makeA) // fails
  // polymorphic expression cannot be instantiated to expected type;
  // found : [T]None.type required: Test.fooWrap.a.A[_]

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta