diff --git a/Control/Monad/Loc.hs b/Control/Monad/Loc.hs
--- a/Control/Monad/Loc.hs
+++ b/Control/Monad/Loc.hs
@@ -31,7 +31,6 @@
   --
   withLoc :: String -> m a -> m a
 
-
 instance Monad m => MonadLoc m where withLoc _ = id;
 
 
diff --git a/Control/Monad/Loc/Mtl.hs b/Control/Monad/Loc/Mtl.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Loc/Mtl.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE OverlappingInstances #-}
+module Control.Monad.Loc.Mtl where
+
+import Control.Monad.Loc
+
+import Control.Monad.Error
+import Control.Monad.List
+import Control.Monad.Reader
+import Control.Monad.State.Lazy     as Lazy
+import Control.Monad.State.Strict   as Strict
+import Control.Monad.Writer.Lazy    as Lazy
+import Control.Monad.Writer.Strict  as Strict
+import Control.Monad.RWS.Lazy       as Lazy
+import Control.Monad.RWS.Strict     as Strict
+import Data.Monoid
+
+instance MonadLoc m => MonadLoc (ListT m) where
+  withLoc l = ListT . withLoc l . runListT
+
+instance (Error e, MonadLoc m) => MonadLoc (ErrorT e m) where
+  withLoc l = ErrorT . withLoc l . runErrorT
+
+instance MonadLoc m => MonadLoc (ReaderT r m) where
+  withLoc l m = ReaderT $ \r -> withLoc l $ runReaderT m r
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Lazy.WriterT w  m) where
+  withLoc l = Lazy.WriterT . withLoc l . Lazy.runWriterT
+
+instance MonadLoc m => MonadLoc (Lazy.StateT s m) where
+  withLoc l m = Lazy.StateT $ \s -> withLoc l $ Lazy.runStateT m s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Lazy.RWST r w s m) where
+  withLoc l m = Lazy.RWST $ \r s -> withLoc l $ Lazy.runRWST m r s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Strict.WriterT w  m) where
+  withLoc l = Strict.WriterT . withLoc l . Strict.runWriterT
+
+instance MonadLoc m => MonadLoc (Strict.StateT s m) where
+  withLoc l m = Strict.StateT $ \s -> withLoc l $ Strict.runStateT m s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Strict.RWST r w s m) where
+  withLoc l m = Strict.RWST $ \r s -> withLoc l $ Strict.runRWST m r s
diff --git a/Control/Monad/Loc/Transformers.hs b/Control/Monad/Loc/Transformers.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Loc/Transformers.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE OverlappingInstances #-}
+module Control.Monad.Loc.Transformers where
+
+import Control.Monad.Loc
+
+import Control.Monad.Trans.Error
+import Control.Monad.Trans.List
+import Control.Monad.Trans.Reader
+import Control.Monad.Trans.State.Lazy     as Lazy
+import Control.Monad.Trans.State.Strict   as Strict
+import Control.Monad.Trans.Writer.Lazy    as Lazy
+import Control.Monad.Trans.Writer.Strict  as Strict
+import Control.Monad.Trans.RWS.Lazy       as Lazy
+import Control.Monad.Trans.RWS.Strict     as Strict
+import Data.Monoid
+
+instance MonadLoc m => MonadLoc (ListT m) where
+  withLoc l = ListT . withLoc l . runListT
+
+instance (Error e, MonadLoc m) => MonadLoc (ErrorT e m) where
+  withLoc l = ErrorT . withLoc l . runErrorT
+
+instance MonadLoc m => MonadLoc (ReaderT r m) where
+  withLoc l m = ReaderT $ \r -> withLoc l $ runReaderT m r
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Lazy.WriterT w  m) where
+  withLoc l = Lazy.WriterT . withLoc l . Lazy.runWriterT
+
+instance MonadLoc m => MonadLoc (Lazy.StateT s m) where
+  withLoc l m = Lazy.StateT $ \s -> withLoc l $ Lazy.runStateT m s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Lazy.RWST r w s m) where
+  withLoc l m = Lazy.RWST $ \r s -> withLoc l $ Lazy.runRWST m r s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Strict.WriterT w  m) where
+  withLoc l = Strict.WriterT . withLoc l . Strict.runWriterT
+
+instance MonadLoc m => MonadLoc (Strict.StateT s m) where
+  withLoc l m = Strict.StateT $ \s -> withLoc l $ Strict.runStateT m s
+
+instance (Monoid w, MonadLoc m) => MonadLoc (Strict.RWST r w s m) where
+  withLoc l m = Strict.RWST $ \r s -> withLoc l $ Strict.runRWST m r s
diff --git a/monadloc.cabal b/monadloc.cabal
--- a/monadloc.cabal
+++ b/monadloc.cabal
@@ -1,5 +1,5 @@
 name: monadloc
-version: 0.3
+version: 0.4
 Cabal-Version:  >= 1.2.3
 build-type: Simple
 license: PublicDomain
@@ -25,6 +25,12 @@
 Flag syb-in-base
   default: False
 
+Flag mtl
+  default: True
+
+Flag transformers
+  default: True
+
 Library
   buildable: True
   build-depends: pretty, template-haskell
@@ -33,7 +39,18 @@
     build-depends: base >= 3 && < 4
   else
     build-depends: base >= 4 && < 5, syb
-  ghc-options: -Wall
+
+  if flag(mtl)
+    cpp-options: -DMTL
+    build-depends: mtl
+    exposed-modules: Control.Monad.Loc.Mtl
+
+  if flag(transformers)
+    cpp-options: -DTRANSFORMERS
+    build-depends: transformers
+    exposed-modules: Control.Monad.Loc.Transformers
+  
+  ghc-options: -Wall -fno-warn-orphans
   extensions:  FlexibleInstances, OverlappingInstances, UndecidableInstances, TemplateHaskell, PatternGuards
   exposed-modules:
      Control.Monad.Loc
