diff --git a/Data/Graph/AdjacencyMatrix.hs b/Data/Graph/AdjacencyMatrix.hs
--- a/Data/Graph/AdjacencyMatrix.hs
+++ b/Data/Graph/AdjacencyMatrix.hs
@@ -53,3 +53,5 @@
     then Just ix
     else Nothing
     where ix = (i, j)
+
+
diff --git a/Data/Graph/Class.hs b/Data/Graph/Class.hs
--- a/Data/Graph/Class.hs
+++ b/Data/Graph/Class.hs
@@ -13,6 +13,10 @@
 
 module Data.Graph.Class 
   ( Graph(..)
+  , VertexMap
+  , EdgeMap
+  , liftVertexMap
+  , liftEdgeMap
   ) where
 
 import Control.Monad
@@ -20,36 +24,104 @@
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Error
+import Control.Monad.Trans.Reader 
 import Control.Monad.Trans.Class
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Graph.PropertyMap
+import Data.Void
 
+type VertexMap g = PropertyMap g (Vertex g)
+type EdgeMap g = PropertyMap g (Edge g)
+
 class (Monad g, Eq (Vertex g), Eq (Edge g)) => Graph g where
   type Vertex g :: *
   type Edge g :: * 
-  vertexMap :: a -> g (PropertyMap g (Vertex g) a)
-  edgeMap   :: a -> g (PropertyMap g (Edge g) a)
+  vertexMap :: a -> g (VertexMap g a)
+  edgeMap   :: a -> g (EdgeMap g a)
 
+liftVertexMap :: (MonadTrans t, Graph (t g), Graph g, Vertex (t g) ~ Vertex g) 
+              => a -> t g (VertexMap (t g) a)
+liftVertexMap = lift . liftM liftPropertyMap . vertexMap
+{-# INLINE liftVertexMap #-}
+
+liftEdgeMap :: (MonadTrans t, Graph (t g), Graph g, Edge (t g) ~ Edge g) 
+            => a -> t g (EdgeMap (t g) a)
+liftEdgeMap = lift . liftM liftPropertyMap . edgeMap
+{-# INLINE liftEdgeMap #-}
+
 instance Graph g => Graph (Strict.StateT s g) where
   type Vertex (Strict.StateT s g) = Vertex g
   type Edge (Strict.StateT s g) = Edge g
-  vertexMap = lift . liftM liftPropertyMap . vertexMap
-  edgeMap = lift . liftM liftPropertyMap . edgeMap
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
 
 instance Graph g => Graph (Lazy.StateT s g) where
   type Vertex (Lazy.StateT s g) = Vertex g
   type Edge (Lazy.StateT s g) = Edge g
-  vertexMap = lift . liftM liftPropertyMap . vertexMap
-  edgeMap = lift . liftM liftPropertyMap . edgeMap
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
 
 instance (Graph g, Monoid m) => Graph (Strict.WriterT m g) where
   type Vertex (Strict.WriterT m g) = Vertex g
   type Edge (Strict.WriterT m g) = Edge g
-  vertexMap = lift . liftM liftPropertyMap . vertexMap
-  edgeMap = lift . liftM liftPropertyMap . edgeMap
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
 
 instance (Graph g, Monoid m) => Graph (Lazy.WriterT m g) where
   type Vertex (Lazy.WriterT m g) = Vertex g
   type Edge (Lazy.WriterT m g) = Edge g
-  vertexMap = lift . liftM liftPropertyMap . vertexMap
-  edgeMap = lift . liftM liftPropertyMap . edgeMap
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance Graph g => Graph (ReaderT m g) where
+  type Vertex (ReaderT m g) = Vertex g 
+  type Edge (ReaderT m g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance Graph g => Graph (IdentityT g) where
+  type Vertex (IdentityT g) = Vertex g
+  type Edge (IdentityT g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance Graph g => Graph (MaybeT g) where
+  type Vertex (MaybeT g) = Vertex g
+  type Edge (MaybeT g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance (Graph g, Error e) => Graph (ErrorT e g) where
+  type Vertex (ErrorT e g) = Vertex g
+  type Edge (ErrorT e g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance (Graph g, Monoid w) => Graph (Lazy.RWST r w s g) where
+  type Vertex (Lazy.RWST r w s g) = Vertex g
+  type Edge (Lazy.RWST r w s g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+instance (Graph g, Monoid w) => Graph (Strict.RWST r w s g) where
+  type Vertex (Strict.RWST r w s g) = Vertex g
+  type Edge (Strict.RWST r w s g) = Edge g
+  vertexMap = liftVertexMap
+  edgeMap = liftEdgeMap
+
+voidMap :: PropertyMap Identity Void a
+voidMap = PropertyMap (Identity . void) $ \_ _ -> Identity voidMap
+
+-- | The empty graph
+instance Graph Identity where
+  type Vertex Identity = Void
+  type Edge Identity = Void
+  vertexMap _ = Identity voidMap 
+  edgeMap   _ = Identity voidMap
+
diff --git a/Data/Graph/Class/AdjacencyList.hs b/Data/Graph/Class/AdjacencyList.hs
--- a/Data/Graph/Class/AdjacencyList.hs
+++ b/Data/Graph/Class/AdjacencyList.hs
@@ -17,12 +17,19 @@
   , module Data.Graph.Class
   ) where
 
+import Control.Monad
+import Control.Monad.Trans.Class
 import qualified Control.Monad.Trans.State.Strict as Strict
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
-import Control.Monad
-import Control.Monad.Trans.Class
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Error
+import Control.Monad.Trans.Reader
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Graph.Class
 
@@ -73,3 +80,50 @@
   outEdges = lift . outEdges
   outDegree = lift . outDegree
 
+instance (AdjacencyListGraph g, Monoid m) => AdjacencyListGraph (Strict.RWST r m s g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance (AdjacencyListGraph g, Monoid m) => AdjacencyListGraph (Lazy.RWST r m s g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance AdjacencyListGraph g => AdjacencyListGraph (ReaderT e g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance (AdjacencyListGraph g, Error e) => AdjacencyListGraph (ErrorT e g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance AdjacencyListGraph g => AdjacencyListGraph (MaybeT g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance AdjacencyListGraph g => AdjacencyListGraph (IdentityT g) where
+  adjacentVertices = lift . adjacentVertices
+  source = lift . source
+  target = lift . target
+  outEdges = lift . outEdges
+  outDegree = lift . outDegree
+
+instance AdjacencyListGraph Identity where
+  source = Identity
+  target = Identity
+  outEdges _ = Identity []
+  outDegree _ = Identity 0
diff --git a/Data/Graph/Class/AdjacencyMatrix.hs b/Data/Graph/Class/AdjacencyMatrix.hs
--- a/Data/Graph/Class/AdjacencyMatrix.hs
+++ b/Data/Graph/Class/AdjacencyMatrix.hs
@@ -20,7 +20,14 @@
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Reader
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Error
 import Control.Monad.Trans.Class
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Graph.Class
 
@@ -39,3 +46,23 @@
 instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Lazy.WriterT m g) where
   edge a b = lift (edge a b)
 
+instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Strict.RWST r m s g) where
+  edge a b = lift (edge a b)
+
+instance (AdjacencyMatrixGraph g, Monoid m) => AdjacencyMatrixGraph (Lazy.RWST r m s g) where
+  edge a b = lift (edge a b)
+
+instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (MaybeT g) where
+  edge a b = lift (edge a b)
+
+instance (AdjacencyMatrixGraph g, Error e) => AdjacencyMatrixGraph (ErrorT e g) where
+  edge a b = lift (edge a b)
+
+instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (IdentityT g) where
+  edge a b = lift (edge a b)
+
+instance AdjacencyMatrixGraph g => AdjacencyMatrixGraph (ReaderT e g) where
+  edge a b = lift (edge a b)
+
+instance AdjacencyMatrixGraph Identity where
+  edge _ _ = Identity Nothing
diff --git a/Data/Graph/Class/Bidirectional.hs b/Data/Graph/Class/Bidirectional.hs
--- a/Data/Graph/Class/Bidirectional.hs
+++ b/Data/Graph/Class/Bidirectional.hs
@@ -17,11 +17,18 @@
   ) where
 
 import Control.Monad
+import Control.Monad.Trans.Class
 import qualified Control.Monad.Trans.State.Strict as Strict
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
-import Control.Monad.Trans.Class
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Reader
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Error
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Graph.Class.AdjacencyList
 
@@ -61,3 +68,46 @@
   inDegree = lift . inDegree
   incidentEdges = lift . incidentEdges
   degree = lift . degree
+
+instance (BidirectionalGraph g, Monoid m) => BidirectionalGraph (Strict.RWST r m s g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance (BidirectionalGraph g, Monoid m) => BidirectionalGraph (Lazy.RWST r m s g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance BidirectionalGraph g => BidirectionalGraph (ReaderT e g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance BidirectionalGraph g => BidirectionalGraph (IdentityT g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance BidirectionalGraph g => BidirectionalGraph (MaybeT g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance (BidirectionalGraph g, Error e) => BidirectionalGraph (ErrorT e g) where
+  inEdges  = lift . inEdges
+  inDegree = lift . inDegree
+  incidentEdges = lift . incidentEdges
+  degree = lift . degree
+
+instance BidirectionalGraph Identity where
+  inEdges _ = Identity []
+  inDegree _ = Identity 0
+  incidentEdges _ = Identity []
+  degree _  = Identity 0
+
diff --git a/Data/Graph/Class/EdgeEnumerable.hs b/Data/Graph/Class/EdgeEnumerable.hs
--- a/Data/Graph/Class/EdgeEnumerable.hs
+++ b/Data/Graph/Class/EdgeEnumerable.hs
@@ -20,7 +20,14 @@
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Reader
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Error
 import Control.Monad.Trans.Class
+import Data.Functor.Identity
 import Data.Monoid
 import Data.Graph.Class
 
@@ -39,3 +46,24 @@
 
 instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Lazy.WriterT m g) where
   edges = lift edges
+
+instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Strict.RWST r m s g) where
+  edges = lift edges
+
+instance (EdgeEnumerableGraph g, Monoid m) => EdgeEnumerableGraph (Lazy.RWST r m s g) where
+  edges = lift edges
+
+instance EdgeEnumerableGraph g => EdgeEnumerableGraph (MaybeT g) where
+  edges = lift edges
+
+instance EdgeEnumerableGraph g => EdgeEnumerableGraph (IdentityT g) where
+  edges = lift edges
+
+instance (EdgeEnumerableGraph g, Error e) => EdgeEnumerableGraph (ErrorT e g) where
+  edges = lift edges
+
+instance EdgeEnumerableGraph g => EdgeEnumerableGraph (ReaderT e g) where
+  edges = lift edges
+
+instance EdgeEnumerableGraph Identity where
+  edges = Identity []
diff --git a/Data/Graph/Class/VertexEnumerable.hs b/Data/Graph/Class/VertexEnumerable.hs
--- a/Data/Graph/Class/VertexEnumerable.hs
+++ b/Data/Graph/Class/VertexEnumerable.hs
@@ -20,9 +20,16 @@
 import qualified Control.Monad.Trans.State.Lazy as Lazy
 import qualified Control.Monad.Trans.Writer.Strict as Strict
 import qualified Control.Monad.Trans.Writer.Lazy as Lazy
+import qualified Control.Monad.Trans.RWS.Strict as Strict
+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
+import Control.Monad.Trans.Identity
+import Control.Monad.Trans.Maybe
+import Control.Monad.Trans.Error
 import Control.Monad.Trans.Class
+import Control.Monad.Trans.Reader
 import Data.Monoid
 import Data.Graph.Class
+import Data.Functor.Identity
 
 class Graph g => VertexEnumerableGraph g where
   -- | /O(v)/
@@ -40,3 +47,23 @@
 instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Lazy.WriterT m g) where
   vertices = lift vertices
 
+instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Strict.RWST r m s g) where
+  vertices = lift vertices
+  
+instance (VertexEnumerableGraph g, Monoid m) => VertexEnumerableGraph (Lazy.RWST r m s g) where
+  vertices = lift vertices
+
+instance VertexEnumerableGraph g => VertexEnumerableGraph (MaybeT g) where
+  vertices = lift vertices
+
+instance VertexEnumerableGraph g => VertexEnumerableGraph (IdentityT g) where
+  vertices = lift vertices
+
+instance (VertexEnumerableGraph g, Error e) => VertexEnumerableGraph (ErrorT e g) where
+  vertices = lift vertices
+
+instance VertexEnumerableGraph g => VertexEnumerableGraph (ReaderT m g) where
+  vertices = lift vertices
+
+instance VertexEnumerableGraph Identity where
+  vertices = Identity []
diff --git a/Data/Graph/Empty.hs b/Data/Graph/Empty.hs
deleted file mode 100644
--- a/Data/Graph/Empty.hs
+++ /dev/null
@@ -1,73 +0,0 @@
-{-# LANGUAGE TypeFamilies #-}
------------------------------------------------------------------------------
--- |
--- Module      :  Data.Graph.Empty
--- Copyright   :  (C) 2011 Edward Kmett
--- License     :  BSD-style (see the file LICENSE)
---
--- Maintainer  :  Edward Kmett <ekmett@gmail.com>
--- Stability   :  experimental
--- Portability :  type families
---
-----------------------------------------------------------------------------
-
-module Data.Graph.Empty
-  ( Empty(..)
-  ) where
-
-import Control.Applicative
-import Control.Monad
-import Data.Void
-import Data.Graph.PropertyMap
-import Data.Graph.Class.AdjacencyList
-import Data.Graph.Class.AdjacencyMatrix
-import Data.Graph.Class.VertexEnumerable
-import Data.Graph.Class.EdgeEnumerable
-import Data.Graph.Class.Bidirectional
-
-newtype Empty a = Empty { runEmpty :: a }
-
-instance Functor Empty where
-  fmap f (Empty g) = Empty $ f g
-  b <$ _ = Empty b
-
-instance Applicative Empty where
-  pure = Empty 
-  Empty f <*> Empty a = Empty (f a)
-  a <* _ = a
-  _ *> b = b
-
-instance Monad Empty where
-  return = Empty
-  Empty g >>= k = k g
-  _ >> b = b
-
-voidMap :: PropertyMap Empty Void a
-voidMap = PropertyMap (Empty . void) $ \_ _ -> Empty voidMap
-
-instance Graph Empty where
-  type Vertex Empty = Void
-  type Edge Empty = Void
-  vertexMap _ = Empty voidMap 
-  edgeMap   _ = Empty voidMap
-
-instance AdjacencyMatrixGraph Empty where
-  edge _ _ = Empty Nothing
-
-instance AdjacencyListGraph Empty where
-  source = Empty
-  target = Empty
-  outEdges _ = Empty []
-  outDegree _ = Empty 0
-
-instance BidirectionalGraph Empty where
-  inEdges _ = Empty []
-  inDegree _ = Empty 0
-  incidentEdges _ = Empty []
-  degree _  = Empty 0
-
-instance EdgeEnumerableGraph Empty where
-  edges = return []
-
-instance VertexEnumerableGraph Empty where
-  vertices = return []
diff --git a/graphs.cabal b/graphs.cabal
--- a/graphs.cabal
+++ b/graphs.cabal
@@ -1,6 +1,6 @@
 name:          graphs
 category:      Data Structures
-version:       0.1
+version:       0.2
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -38,7 +38,6 @@
     Data.Graph.Class.Bidirectional
     Data.Graph.Class.VertexEnumerable
     Data.Graph.Dual
-    Data.Graph.Empty
     Data.Graph.PropertyMap
   other-modules
     Data.Graph.Internal.Color
