Despacho de método Java con argumento nulo

¿Por qué (aparentemente) hace una diferencia si pasonull como argumento directamente, o pasar unObject que le asigné elvalor null?

Object testVal = null;
test.foo(testVal);    // dispatched to foo(Object)
// test.foo(null);    // compilation problem -> "The method foo(String) is ambiguous"   

public void foo(String arg) { // More-specific
    System.out.println("foo(String)");
}

public void foo(Object arg) { // Generic
    System.out.println("foo(Object)");
}

En otras palabras, ¿por qué es la segunda llamada (comentada) afoo(...) no enviado afoo(Object)?

Actualizar: Yo uso Java 1.6. Podría compilar el código de Hemal sin problemas, pero el mío todavía no se compila. La única diferencia que veo es que los métodos de Hemal son estáticos mientras que los míos no. Pero realmente no veo por qué esto debería hacer la diferencia ...?

Actualización 2: Resuelto Tenía otro método foo (Runnable) en mi clase, por lo que el despachador no podía seleccionar inequívocamente el método más específico. (Vea mi comentario en la segunda respuesta de Hemal.) Gracias a todos por su ayuda.

Respuestas a la pregunta(4)

Su respuesta a la pregunta