Of course, you can just upcast to Animal and bypass the constraint…
By way of demonstration, continuing @tpolecat’s example:
scala> blah(new Bar)
:17: error: ambiguous implicit values:
both method nsubAmbig1 in package shapeless of type [A, B >: A]=> A <:!< B
and method nsubAmbig2 in package shapeless of type [A, B >: A]=> A <:!< B
match expected type Bar <:!< Veg
scala> blah(new Bar: Animal)
res2: Animal = Bar@7c33e49a
So with respect to classes of values, use of <:!< should be considered
advisory, or an aid to [disambiguating] implicit resolution, not a
guarantee. Of course it’s entirely correct when considered on the level
it’s trying to operate on, types not classes: the /type/ Animal indeed
is not <: Veg, and so the second call compiles.
There is a good theoretical reason why this /must/ be so, @fhalde, which
I have elided here.