On , oleg@okmij.org wrote:<br />&gt; [...]<br />&gt; Exactly this code is implemented in Example.hs. Here&#39;s an excerpt:<br />&gt; <br />&gt; <br />&gt; <br />&gt; &gt; -- Default instance<br />&gt; <br />&gt; <br />&gt; <br />&gt; &gt; instance (Monad (t m), MonadState m, MonadTrans t)<br />&gt; <br />&gt; &gt;     =&gt; MonadState&#39; (t m) HFalse where<br />&gt; <br />&gt; &gt;     type MState&#39; (t m) HFalse = MState m<br />&gt; <br />&gt; &gt;     get&#39; _ = trace &quot;Default get&quot; $ lift get<br />&gt; <br />&gt; &gt;     put&#39; _ = lift . put<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; -- Special instances<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; instance (Monad m)<br />&gt; <br />&gt; &gt;     =&gt; MonadState&#39; (StateT s m) HTrue where<br />&gt; <br />&gt; &gt;     type MState&#39; (StateT s m) HTrue = s<br />&gt; <br />&gt; &gt;     get&#39; _ = trace &quot;Special get&quot; . StateT $ \s -&gt; return (s, s)<br />&gt; <br />&gt; &gt;     put&#39; _ s = StateT $ \_ -&gt; return ((), s)<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; -- add more special instances if needed ...<br />&gt; <br />&gt; <br />&gt; <br />&gt; plus one more general dispatching instance. Because of the additional<br />&gt; <br />&gt; flag, HTrue vs HFalse, the above instances do not overlap.<br /><br />Can you add more special instances for types that match (t m) without using OverlappingInstances and without modifying the instances you have above?