{-# LANGUAGE UndecidableInstances, KindSignatures, TypeApplications, FlexibleInstances #-} class A (m :: * -> *) class A1 (m :: * -> *) class B (m :: * -> *) instance A m => B m instance {-# OVERLAPPING #-} A1 m => B m data C a instance A C data D a instance A1 D implicitly :: a => () implicitly = () test = implicitly @(B C) test1 = implicitly @(B D) main = print "ok"