¿Cómo elige el compilador VB.NET qué sobrecarga de extensión ejecutar?

Tengo una curiosidad interesante: pensé que alguien podría ayudar.

Esto salió de alguna diversión con tipos anulables de esta pregunta:

¿Cómo comprobar si un objeto es anulable?

Option Strict On

Module Test
  ' Call this overload 1
  <Extension()>
  Function IsNullable(obj As ValueType) As Boolean
    Return False
  End Function

  ' Call this overload 2
  <Extension()>
  Function IsNullable(Of T As {Structure})(obj As Nullable(Of T)) As Boolean
    Return True
  End Function

  Sub Test() 
    ' a is an integer!
    Dim a As Integer = 123

    ' calling IsNullable as an extension method calls overload 1 and returns false
    Dim result1 As Boolean = a.IsNullable()

    ' calling IsNullable as method calls overload 2 and returns true
    Dim result2 As Boolean = IsNullable(a)

    ' why? surely the compiler should treat both those calls as equivalent
  End Sub
End Module

Yo esperaría que ambas llamadas a IsNullable fueran tratadas de la misma manera por el compilador, pero ese no es el caso. La llamada al método de extensión usa una sobrecarga diferente a la llamada al método normal, aunque el argumento "a" no se haya modificado.

Mi pregunta es ¿por qué? ¿Qué hace que el compilador cambie de opinión entre las dos llamadas?

FTR: Estamos utilizando Visual Studio 2010, .NET Framework 4.

Respuestas a la pregunta(2)

Su respuesta a la pregunta