I used the Scala 2.0 interpreter...

class Up {}

class Middle extends Up {}

class Bottom extends Middle {}

class Top { def cv(t: Up) = "Top"; def inv(m: Middle) = "Top"; def ctv(b: Bottom) = "Top"; }

class Down extends Top {def cv(m: Middle) = "Down";override def inv(m: Middle) = "Down"; def ctv(m: Middle) = "Down";}

def testcv1(t: Top) = {Console.println(t.cv(new Up()));Console.println(t.cv(new Middle()));Console.println(t.cv(new Bottom()));} 
def testcv2(d: Down) = {Console.println(d.cv(new Up())); Console.println(d.cv(new Middle())); Console.println(d.cv(new Bottom()));} 

def testinv1(t: Top) = {Console.println("type mismatch; found : Up required: Middle");Console.println(t.inv(new Middle()));Console.println(t.inv(new Bottom()));} 
def testinv2(d: Down) = {Console.println("type mismatch; found : Up required: Middle");Console.println(d.inv(new Middle()));Console.println(d.inv(new Bottom()));} 

def testctv1(t: Top) = {Console.println("type mismatch; found : Up required: Bottom");Console.println("type mismatch; found : Middle required: Bottom") ;Console.println(t.ctv(new Bottom()));} 
def testctv2(d: Down) = {Console.println("type mismatch; found : Up required: Bottom");Console.println(d.ctv(new Middle()));Console.println("ambiguous reference to overloaded definition, both method ctv in class Down of type (line2$object.Middle)java.lang.String and  method ctv in class Top of type (line3$object.Bottom)java.lang.String match argument types (line3$object.Bottom) and expected result type scala.Any"); }

-- run
scala> Console.println("First column");
testcv1(new Top());
testinv1(new Top());
testctv1(new Top());
Console.println("Second column");
testcv2(new Down());
testinv2(new Down());
testctv2(new Down());
Console.println("Third column");
testcv1(new Down());
testinv1(new Down());
First column
line15: scala.Unit = ()

scala> Top
Top
Top
line16: scala.Unit = ()

scala> type mismatch; found : Up required: Middle
Top
Top
line17: scala.Unit = ()

scala> type mismatch; found : Up required: Bottom
type mismatch; found : Middle required: Bottom
Top
line18: scala.Unit = ()

scala> Second column
line19: scala.Unit = ()

scala> Top
Down
Down
line20: scala.Unit = ()

scala> type mismatch; found : Up required: Middle
Down
Down
line21: scala.Unit = ()

scala> type mismatch; found : Up required: Bottom
Down
ambiguous reference to overloaded definition, both method ctv in class Down of t
ype (line2$object.Middle)java.lang.String and  method ctv in class Top of type (
line3$object.Bottom)java.lang.String match argument types (line3$object.Bottom)
and expected result type scala.Any
line22: scala.Unit = ()

scala> Third column
line23: scala.Unit = ()

scala> Top
Top
Top
line24: scala.Unit = ()

scala> type mismatch; found : Up required: Middle
Down
Down
line25: scala.Unit = ()

scala> testctv1(new Down());
type mismatch; found : Up required: Bottom
type mismatch; found : Middle required: Bottom
Top
line26: scala.Unit = ()

scala>