diff --git a/Control/Monad/Cont.hs b/Control/Monad/Cont.hs
--- a/Control/Monad/Cont.hs
+++ b/Control/Monad/Cont.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 {- |
 Module      :  Control.Monad.Cont
@@ -146,14 +146,14 @@
 instance (MonadIO m) => MonadIO (ContT r m) where
     liftIO = lift . liftIO
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadReader r' m) => MonadReader r' (ContT r m) where
     ask       = lift ask
     local f m = ContT $ \c -> do
         r <- ask
         local f (runContT m (local (const r) . c))
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadState s m) => MonadState s (ContT r m) where
     get = lift get
     put = lift . put
diff --git a/Control/Monad/Cont/Class.hs b/Control/Monad/Cont/Class.hs
--- a/Control/Monad/Cont/Class.hs
+++ b/Control/Monad/Cont/Class.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 {- |
 Module      :  Control.Monad.Cont.Class
diff --git a/Control/Monad/Error.hs b/Control/Monad/Error.hs
--- a/Control/Monad/Error.hs
+++ b/Control/Monad/Error.hs
@@ -1,6 +1,9 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}	    -- Temporary, I hope.  SLPJ Aug08
--- Needed for the same reasons as in Reader, State etc
+-- Undecidable instances needed for the same reasons as in Reader, State etc:
+{-# LANGUAGE UndecidableInstances #-}
+-- De-orphaning this module is tricky:
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+-- To handle instances moved to base:
+{-# LANGUAGE CPP #-}
 
 {- |
 Module      :  Control.Monad.Error
@@ -53,15 +56,18 @@
 import Control.Monad.Cont.Class
 import Control.Monad.Error.Class
 import Control.Monad.Fix
-import Control.Monad.RWS.Class
 import Control.Monad.Reader.Class
 import Control.Monad.State.Class
 import Control.Monad.Trans
 import Control.Monad.Writer.Class
+import Control.Monad.RWS.Class
 
 import Control.Monad.Instances ()
-import System.IO
 
+-- | Note: this instance does not satisfy the second 'MonadPlus' law
+--
+-- > v >> mzero   =  mzero
+--
 instance MonadPlus IO where
     mzero       = ioError (userError "mzero")
     m `mplus` n = m `catch` \_ -> n
@@ -73,23 +79,28 @@
 -- ---------------------------------------------------------------------------
 -- Our parameterizable error monad
 
-instance (Error e) => Monad (Either e) where
+#if !(MIN_VERSION_base(4,2,1))
+
+-- These instances are in base-4.3
+
+instance Monad (Either e) where
     return        = Right
     Left  l >>= _ = Left l
     Right r >>= k = k r
-    fail msg      = Left (strMsg msg)
 
-instance (Error e) => MonadPlus (Either e) where
-    mzero            = Left noMsg
-    Left _ `mplus` n = n
-    m      `mplus` _ = m
-
-instance (Error e) => MonadFix (Either e) where
+instance MonadFix (Either e) where
     mfix f = let
         a = f $ case a of
             Right r -> r
             _       -> error "empty mfix argument"
         in a
+
+#endif /* base to 4.2.0.x */
+
+instance (Error e) => MonadPlus (Either e) where
+    mzero            = Left noMsg
+    Left _ `mplus` n = n
+    m      `mplus` _ = m
 
 instance (Error e) => MonadError e (Either e) where
     throwError             = Left
diff --git a/Control/Monad/Error/Class.hs b/Control/Monad/Error/Class.hs
--- a/Control/Monad/Error/Class.hs
+++ b/Control/Monad/Error/Class.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 -- Needed for the same reasons as in Reader, State etc
 
 {- |
diff --git a/Control/Monad/List.hs b/Control/Monad/List.hs
--- a/Control/Monad/List.hs
+++ b/Control/Monad/List.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 -- Needed for the same reasons as in Reader, State etc
 
 -----------------------------------------------------------------------------
diff --git a/Control/Monad/RWS/Lazy.hs b/Control/Monad/RWS/Lazy.hs
--- a/Control/Monad/RWS/Lazy.hs
+++ b/Control/Monad/RWS/Lazy.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.RWS.Lazy
@@ -41,11 +41,11 @@
 import Control.Monad.Cont.Class
 import Control.Monad.Error.Class
 import Control.Monad.Fix
-import Control.Monad.RWS.Class
 import Control.Monad.Reader.Class
 import Control.Monad.State.Class
 import Control.Monad.Trans
 import Control.Monad.Writer.Class
+import Control.Monad.RWS.Class
 import Data.Monoid
 
 newtype RWS r w s a = RWS { runRWS :: r -> s -> (a, s, w) }
diff --git a/Control/Monad/RWS/Strict.hs b/Control/Monad/RWS/Strict.hs
--- a/Control/Monad/RWS/Strict.hs
+++ b/Control/Monad/RWS/Strict.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.RWS.Strict
@@ -41,11 +41,11 @@
 import Control.Monad.Cont.Class
 import Control.Monad.Error.Class
 import Control.Monad.Fix
-import Control.Monad.RWS.Class
 import Control.Monad.Reader.Class
 import Control.Monad.State.Class
 import Control.Monad.Trans
 import Control.Monad.Writer.Class
+import Control.Monad.RWS.Class
 import Data.Monoid
 
 newtype RWS r w s a = RWS { runRWS :: r -> s -> (a, s, w) }
diff --git a/Control/Monad/Reader.hs b/Control/Monad/Reader.hs
--- a/Control/Monad/Reader.hs
+++ b/Control/Monad/Reader.hs
@@ -1,5 +1,4 @@
-{-# OPTIONS_GHC -fno-warn-orphans #-}	    -- Temporary, I hope.  SLPJ Aug08
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 {- |
 Module      :  Control.Monad.Reader
 Copyright   :  (c) Andy Gill 2001,
@@ -69,13 +68,6 @@
 import Control.Monad.Trans
 import Control.Monad.Writer.Class
 
--- ----------------------------------------------------------------------------
--- The partially applied function type is a simple reader monad
-
-instance MonadReader r ((->) r) where
-    ask       = id
-    local f m = m . f
-
 {- |
 The parameterizable reader monad.
 
@@ -175,12 +167,12 @@
     m `catchError` h = ReaderT $ \r -> runReaderT m r
         `catchError` \e -> runReaderT (h e) r
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadState s m) => MonadState s (ReaderT r m) where
     get = lift get
     put = lift . put
 
--- This instance needs -fallow-undecidable-instances, because
+-- This instance needs UndecidableInstances, because
 -- it does not satisfy the coverage condition
 instance (MonadWriter w m) => MonadWriter w (ReaderT r m) where
     tell     = lift . tell
diff --git a/Control/Monad/Reader/Class.hs b/Control/Monad/Reader/Class.hs
--- a/Control/Monad/Reader/Class.hs
+++ b/Control/Monad/Reader/Class.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
+{-# LANGUAGE UndecidableInstances #-}
 {- |
 Module      :  Control.Monad.Reader.Class
 Copyright   :  (c) Andy Gill 2001,
@@ -42,6 +42,8 @@
     asks,
     ) where
 
+import Control.Monad.Instances ()
+
 {- |
 See examples in "Control.Monad.Reader".
 Note, the partially applied function type @(->) r@ is a simple reader monad.
@@ -59,6 +61,13 @@
     * The resulting @Reader@.
     -}
     local :: (r -> r) -> m a -> m a
+
+-- ----------------------------------------------------------------------------
+-- The partially applied function type is a simple reader monad
+
+instance MonadReader r ((->) r) where
+    ask       = id
+    local f m = m . f
 
 {- |
 Retrieves a function of the current environment. Parameters:
diff --git a/Control/Monad/State/Lazy.hs b/Control/Monad/State/Lazy.hs
--- a/Control/Monad/State/Lazy.hs
+++ b/Control/Monad/State/Lazy.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
@@ -210,12 +210,12 @@
     m `catchError` h = StateT $ \s -> runStateT m s
         `catchError` \e -> runStateT (h e) s
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadReader r m) => MonadReader r (StateT s m) where
     ask       = lift ask
     local f m = StateT $ \s -> local f (runStateT m s)
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadWriter w m) => MonadWriter w (StateT s m) where
     tell     = lift . tell
     listen m = StateT $ \s -> do
diff --git a/Control/Monad/State/Strict.hs b/Control/Monad/State/Strict.hs
--- a/Control/Monad/State/Strict.hs
+++ b/Control/Monad/State/Strict.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
@@ -209,12 +209,12 @@
     m `catchError` h = StateT $ \s -> runStateT m s
         `catchError` \e -> runStateT (h e) s
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadReader r m) => MonadReader r (StateT s m) where
     ask       = lift ask
     local f m = StateT $ \s -> local f (runStateT m s)
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (MonadWriter w m) => MonadWriter w (StateT s m) where
     tell     = lift . tell
     listen m = StateT $ \s -> do
diff --git a/Control/Monad/Trans.hs b/Control/Monad/Trans.hs
--- a/Control/Monad/Trans.hs
+++ b/Control/Monad/Trans.hs
@@ -23,8 +23,6 @@
     MonadIO(..),
   ) where
 
-import System.IO
-
 -- ---------------------------------------------------------------------------
 -- MonadTrans class
 --
diff --git a/Control/Monad/Writer.hs b/Control/Monad/Writer.hs
--- a/Control/Monad/Writer.hs
+++ b/Control/Monad/Writer.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
diff --git a/Control/Monad/Writer/Class.hs b/Control/Monad/Writer/Class.hs
--- a/Control/Monad/Writer/Class.hs
+++ b/Control/Monad/Writer/Class.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
diff --git a/Control/Monad/Writer/Lazy.hs b/Control/Monad/Writer/Lazy.hs
--- a/Control/Monad/Writer/Lazy.hs
+++ b/Control/Monad/Writer/Lazy.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
@@ -137,13 +137,13 @@
     m `catchError` h = WriterT $ runWriterT m
         `catchError` \e -> runWriterT (h e)
 
--- This instance needs -fallow-undecidable-instances, because
+-- This instance needs UndecidableInstances, because
 -- it does not satisfy the coverage condition
 instance (Monoid w, MonadReader r m) => MonadReader r (WriterT w m) where
     ask       = lift ask
     local f m = WriterT $ local f (runWriterT m)
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (Monoid w, MonadState s m) => MonadState s (WriterT w m) where
     get = lift get
     put = lift . put
diff --git a/Control/Monad/Writer/Strict.hs b/Control/Monad/Writer/Strict.hs
--- a/Control/Monad/Writer/Strict.hs
+++ b/Control/Monad/Writer/Strict.hs
@@ -1,5 +1,5 @@
-{-# OPTIONS -fallow-undecidable-instances #-}
--- Search for -fallow-undecidable-instances to see why this is needed
+{-# LANGUAGE UndecidableInstances #-}
+-- Search for UndecidableInstances to see why this is needed
 
 -----------------------------------------------------------------------------
 -- |
@@ -139,13 +139,13 @@
     m `catchError` h = WriterT $ runWriterT m
         `catchError` \e -> runWriterT (h e)
 
--- This instance needs -fallow-undecidable-instances, because
+-- This instance needs UndecidableInstances, because
 -- it does not satisfy the coverage condition
 instance (Monoid w, MonadReader r m) => MonadReader r (WriterT w m) where
     ask       = lift ask
     local f m = WriterT $ local f (runWriterT m)
 
--- Needs -fallow-undecidable-instances
+-- Needs UndecidableInstances
 instance (Monoid w, MonadState s m) => MonadState s (WriterT w m) where
     get = lift get
     put = lift . put
diff --git a/Makefile.inc b/Makefile.inc
deleted file mode 100644
--- a/Makefile.inc
+++ /dev/null
@@ -1,7 +0,0 @@
-ifeq "" "${MKDIR}"
-MKDIR:=$(shell pwd)
-#MKDIR:=$(PWD)
-else
-MKDIR:=$(patsubst %/$(notdir ${MKDIR}),%, ${MKDIR})
-endif
-include ${MKDIR}/Makefile.inc
diff --git a/Makefile.nhc98 b/Makefile.nhc98
deleted file mode 100644
--- a/Makefile.nhc98
+++ /dev/null
@@ -1,12 +0,0 @@
-THISPKG	= mtl
-SEARCH	=
-
-SRCS	= \
-	Control/Monad/Identity.hs \
-	Control/Monad/Trans.hs
-
-# Here are the main rules.
-include ../Makefile.common
-
-# (no dependencies)
-
diff --git a/mtl.cabal b/mtl.cabal
--- a/mtl.cabal
+++ b/mtl.cabal
@@ -1,5 +1,5 @@
 name:         mtl
-version:      1.1.0.2
+version:      1.1.1.0
 license:      BSD3
 license-file: LICENSE
 author:       Andy Gill
@@ -35,7 +35,7 @@
     Control.Monad.Writer.Class
     Control.Monad.Writer.Lazy
     Control.Monad.Writer.Strict
-build-depends: base
+build-depends: base < 5
 extensions: MultiParamTypeClasses,
             FunctionalDependencies,
             FlexibleInstances,
diff --git a/prologue.txt b/prologue.txt
deleted file mode 100644
--- a/prologue.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-A monad transformer library, inspired by the paper
-/Functional Programming with Overloading and Higher-Order Polymorphism/,
-Mark P Jones (<http://www.cse.ogi.edu/~mpj/>)
-Advanced School of Functional Programming, 1995.
