diff --git a/haskell-packages.cabal b/haskell-packages.cabal
--- a/haskell-packages.cabal
+++ b/haskell-packages.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                haskell-packages
-version:             0.2.1
+version:             0.2.2
 synopsis:            Haskell suite library for package management and integration with Cabal
 description:         See <http://documentup.com/haskell-suite/haskell-packages>
 license:             MIT
@@ -25,12 +25,13 @@
 source-repository this
   type:     git
   location: git://github.com/haskell-suite/haskell-packages.git
-  tag:      v0.2.1
+  tag:      v0.2.2
 
 library
   default-language:    Haskell2010
   Hs-source-dirs:
     src
+  ghc-options: -Wall -fno-warn-name-shadowing
   exposed-modules:
     Distribution.HaskellSuite
     Distribution.HaskellSuite.Compiler
@@ -49,7 +50,7 @@
     , directory
     , filepath
     , containers
-    , mtl
+    , mtl >= 2.1
     , hse-cpp
     , EitherT
     , haskell-src-exts >= 1.14
diff --git a/src/Distribution/HaskellSuite/Cabal.hs b/src/Distribution/HaskellSuite/Cabal.hs
--- a/src/Distribution/HaskellSuite/Cabal.hs
+++ b/src/Distribution/HaskellSuite/Cabal.hs
@@ -165,7 +165,10 @@
   show (ModuleNotFound mod) = printf "Module %s not found" mod
 instance Exception ModuleNotFound
 
+findModules :: [FilePath] -> [String] -> IO [FilePath]
 findModules srcDirs = mapM (findModule srcDirs)
+
+findModule :: [FilePath] -> String -> IO FilePath
 findModule srcDirs mod = do
   r <- runEitherT $ sequence_ (checkInDir <$> srcDirs <*> exts)
   case r of
diff --git a/src/Distribution/HaskellSuite/Compiler.hs b/src/Distribution/HaskellSuite/Compiler.hs
--- a/src/Distribution/HaskellSuite/Compiler.hs
+++ b/src/Distribution/HaskellSuite/Compiler.hs
@@ -33,7 +33,6 @@
 import Distribution.ModuleName (ModuleName)
 import Control.Monad
 import Control.Exception
-import Data.Maybe
 import Data.List
 import Data.Function
 import Language.Haskell.Exts.Annotated.CPP
@@ -104,7 +103,7 @@
     -> PackageDB
     -> InstalledPackageInfo
     -> IO ()
-  register t dbspec pkg = do
+  register _tool dbspec pkg = do
     mbDb <- locateDB dbspec
 
     case mbDb :: Maybe (DB compiler) of
@@ -120,7 +119,7 @@
     -> PackageDB
     -> PackageId
     -> IO ()
-  unregister t dbspec pkg = do
+  unregister _tool dbspec pkg = do
     let
       pkgCriterion =
         -- if the version is not specified, treat it as a wildcard
@@ -155,7 +154,7 @@
     :: compiler
     -> PackageDB
     -> IO ()
-  list t dbspec = do
+  list _tool dbspec = do
     mbDb <- locateDB dbspec
 
     case mbDb :: Maybe (DB compiler) of
diff --git a/src/Distribution/HaskellSuite/Modules.hs b/src/Distribution/HaskellSuite/Modules.hs
--- a/src/Distribution/HaskellSuite/Modules.hs
+++ b/src/Distribution/HaskellSuite/Modules.hs
@@ -1,6 +1,8 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies,
              FlexibleInstances, TypeSynonymInstances,
-             DeriveDataTypeable #-}
+             DeriveDataTypeable, StandaloneDeriving,
+             MultiParamTypeClasses, UndecidableInstances,
+             ScopedTypeVariables #-}
 module Distribution.HaskellSuite.Modules
   (
   -- * Module monad
@@ -26,24 +28,20 @@
   , ModName(..)
   , convertModuleName
   ) where
-
 import Distribution.HaskellSuite.Packages
-import Distribution.Simple.Compiler
 import Distribution.Simple.Utils
 import Distribution.InstalledPackageInfo
-import Distribution.Package
 import Distribution.Text
 import Distribution.ModuleName
 import Control.Applicative
 import Control.Monad
 import Control.Monad.State
+import Control.Monad.Cont
+import Control.Monad.Error
 import Control.Monad.Reader
-import Control.Exception
+import Control.Monad.Writer
 import Data.List
-import Data.Typeable
-import Data.Proxy
 import qualified Data.Map as Map
-import Text.Printf
 import System.FilePath
 
 -- | This class defines the interface that is used by 'getModuleInfo', so
@@ -110,10 +108,11 @@
 --
 -- @i@ is the type of module info, @m@ is the underlying monad.
 newtype ModuleT i m a =
-  ModuleT
+  ModuleT { unModuleT ::
     (StateT (Map.Map ModuleName i)
       (ReaderT (Packages, [FilePath] -> ModuleName -> m i) m)
       a)
+  }
   deriving (Functor, Applicative, Monad)
 
 instance MonadTrans (ModuleT i) where
@@ -129,6 +128,30 @@
   getPackages = ModuleT $ asks fst
   readModuleInfo dirs mod =
     lift =<< ModuleT (asks snd) <*> pure dirs <*> pure (convertModuleName mod)
+
+mapModuleT :: Monad m => (m a -> m b) -> ModuleT i m a -> ModuleT i m b
+mapModuleT f m = ModuleT $ mapStateT (mapReaderT f') (unModuleT m)
+  where
+    f' ma = do
+      (a,c) <- ma
+      b <- f (return a)
+      return (b,c)
+
+instance MonadReader r m => MonadReader r (ModuleT i m) where
+  ask    = lift ask
+  local  = mapModuleT . local
+  reader = lift . reader
+
+instance MonadState s m => MonadState s (ModuleT i m) where
+  get   = lift get
+  put   = lift . put
+  state = lift . state
+
+deriving instance MonadWriter w m => MonadWriter w (ModuleT i m)
+
+deriving instance MonadError e m => MonadError e (ModuleT i m)
+
+deriving instance MonadCont m => MonadCont (ModuleT i m)
 
 -- | Run a 'ModuleT' action
 runModuleT
diff --git a/src/Distribution/HaskellSuite/Packages.hs b/src/Distribution/HaskellSuite/Packages.hs
--- a/src/Distribution/HaskellSuite/Packages.hs
+++ b/src/Distribution/HaskellSuite/Packages.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving, DeriveDataTypeable,
              TemplateHaskell, ScopedTypeVariables, OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 module Distribution.HaskellSuite.Packages
   (
   -- * Querying package databases
