I can see a use for comparing objects of different classes, but I don't think IComparable(of T) is the right basis. For such comparisons to really work, the objects must have a common canonical form, which implies that they all be derived from a common ancestor or implement a common interface. I would further suggest that this common base include a SecondChanceCompareTo method, and normal compare method should, if it doesn't recognize the precise type to which it's being compared, pass itself to the passed-in object's SecondChanceCompare method.
As an example of where this type of thing might be useful, imagine a family of classes that store strings; a string might be stored as a straightforward String object, but some strings might be stored as a character and repetition count, others might be stored as a reference to a longer string along with a starting offset and length, etc. It would be possible to compare two string objects by converting them to type "String" and then doing the comparison, but there are many scenarios where better means of comparison exist. For example, if one string is stored as "Character 'Z' repeated 100,000 times" and the other string is stored as "Literal string 'Dog'", the former string could compare itself to the latter by observing that the latter's first character was less than 'Z'.
Note that the basic 'literal string' object might not know how to compare itself to the 'repeated character' string object except by converting the latter to a literal string (an expensive operation), but it could call the latter's "SecondChanceCompare" method, which would know how to compare itself to a literal string.