diff --git a/0.3/Control/Monad/Trans/Except.hs b/0.3/Control/Monad/Trans/Except.hs
--- a/0.3/Control/Monad/Trans/Except.hs
+++ b/0.3/Control/Monad/Trans/Except.hs
@@ -1,7 +1,19 @@
+{-# LANGUAGE CPP #-}
+
+#ifndef MIN_VERSION_mtl
+#define MIN_VERSION_mtl(x,y,z) 1
+#endif
+
+#ifndef HASKELL98
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances #-}
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.Trans.Except
 -- Copyright   :  (C) 2013 Ross Paterson
+--                (C) 2015 Edward Kmett
 -- License     :  BSD-style (see the file LICENSE)
 --
 -- Maintainer  :  ross@soi.city.ac.uk
@@ -39,16 +51,25 @@
     liftPass,
   ) where
 
+import Control.Applicative
+import Control.Monad
+import Control.Monad.Fix
 import Control.Monad.IO.Class
 import Control.Monad.Signatures
 import Control.Monad.Trans.Class
-import Data.Functor.Classes
-import Data.Functor.Identity
 
-import Control.Applicative
-import Control.Monad
-import Control.Monad.Fix
+#ifndef HASKELL98
+import Control.Monad.Writer.Class
+import Control.Monad.State.Class
+import Control.Monad.Reader.Class
+import Control.Monad.Cont.Class
+import Control.Monad.Error.Class
+import Control.Monad.RWS.Class
+#endif
+
 import Data.Foldable (Foldable(foldMap))
+import Data.Functor.Classes
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Traversable (Traversable(traverse))
 
@@ -223,3 +244,40 @@
     return $! case a of
         Left l -> (Left l, id)
         Right (r, f) -> (Right r, f)
+
+-- incurring the mtl dependency for these avoids packages that need them introducing orphans.
+
+#ifndef HASKELL98
+
+instance Monad m => MonadError e (ExceptT e m) where
+    throwError = throwE
+    catchError = catchE
+
+instance MonadWriter w m => MonadWriter w (ExceptT e m) where
+    tell   = lift . tell
+    listen = liftListen listen
+    pass   = liftPass pass
+#if MIN_VERSION_mtl(2,1,0)
+    writer = lift . writer
+#endif
+
+instance MonadState s m => MonadState s (ExceptT e m) where
+  get = lift get
+  put = lift . put
+#if MIN_VERSION_mtl(2,1,0)
+  state = lift . state
+#endif
+
+instance MonadReader r m => MonadReader r (ExceptT e m) where
+  ask    = lift ask
+  local  = mapExceptT . local
+#if MIN_VERSION_mtl(2,1,0)
+  reader = lift . reader
+#endif
+
+instance MonadRWS r w s m => MonadRWS r w s (ExceptT e m)
+
+instance MonadCont m => MonadCont (ExceptT e m) where
+  callCC = liftCallCC callCC
+
+#endif
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,37 @@
+0.4.0.4
+-------
+
+0.4.0.3
+-------
+
+0.4.0.2
+-------
+* Each of these is a build with a different set of flags configured. Building this way allows us to work around bugs in `cabal`'s backtracker.
+
+0.4
+---
+* Added support for the missing `ExceptT` instances from `mtl`.
+
+  This was not done lightly. While this means that by default incurring a dependency on `transformers-compat` drags in `mtl` when you are
+  using an old `transformers`, it means that users do not have to orphan these instances and permits wider adoption of `ExceptT`.
+
+  If you absolutely can't stand `mtl` and really want this package to build as valid `Haskell98`, then you can use `cabal install transformers-compat -f-mtl` to avoid incurring the dependency to get these instances. However, that is effectively an unsupported configuration.
+
+0.3.3.4
+-------
+
+0.3.3.3
+-------
+
+0.3.3.2
+-------
+* These releases were a successful attempt to fix build problems caused by the cabal backtracker.
+* Each of these is a build with a different set of flags configured.
+
+0.3.2
+-----
+* This release was a failed (or at least, only partially successful) attempt to fix build problems caused by the cabal backtracker.
+
 0.3.1
 -----
 * `transformers 0.4.1` compatibility
diff --git a/transformers-compat.cabal b/transformers-compat.cabal
--- a/transformers-compat.cabal
+++ b/transformers-compat.cabal
@@ -1,6 +1,6 @@
 name:          transformers-compat
 category:      Compatibility
-version:       0.3.3.4
+version:       0.4.0.2
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
@@ -13,7 +13,7 @@
 synopsis:      A small compatibility shim exposing the new types from transformers 0.3 and 0.4 to older Haskell platforms.
 description:
   This package includes backported versions of types that were added
-  to transformers in transformers 0.3 an 0.4 for users who need strict
+  to transformers in transformers 0.3 and 0.4 for users who need strict
   transformers 0.2 or 0.3 compatibility to run on old versions of the
   platform, but also need those types.
   .
@@ -39,7 +39,7 @@
   location: git://github.com/ekmett/transformers-compat.git
 
 flag two
-  default: False
+  default: True
   description: Use transformers 0.2. This must be selected manually and should
     probably only be used on older GHCs around 7.0.x.
   manual: True
@@ -49,6 +49,11 @@
   manual: True
   description: Use transformers 0.3. This should toggle on/off automatically.
 
+flag mtl
+  default: True
+  manual: True
+  description: -f-mtl Disables support for mtl for transformers 0.2 and 0.3. That is an unsupported configuration, and results in missing instances for `ExceptT`, but keeps the package Haskell 98.
+
 library
   build-depends:
     base >= 4.3 && < 5
@@ -58,13 +63,20 @@
 
   if flag(three)
     hs-source-dirs: 0.3
-    build-depends: transformers >= 0.3 && < 0.4
+    build-depends:
+      transformers >= 0.3 && < 0.4,
+      mtl >= 2.1 && < 2.2
   else
     if flag(two)
       hs-source-dirs: 0.2 0.3
-      build-depends: transformers >= 0.2 && < 0.3
+      build-depends:
+        transformers >= 0.2 && < 0.3,
+        mtl >= 2.0 && < 2.1
     else
       build-depends: transformers >= 0.4.1 && < 0.5
+
+  if !flag(mtl)
+    cpp-options: -DHASKELL98
 
   if flag(two)
     exposed-modules:
