diff --git a/Control/Monad/Sharing/Implementation/FirstOrder.hs b/Control/Monad/Sharing/Implementation/FirstOrder.hs
--- a/Control/Monad/Sharing/Implementation/FirstOrder.hs
+++ b/Control/Monad/Sharing/Implementation/FirstOrder.hs
@@ -18,7 +18,7 @@
 
  ) where
 
-import Control.Monad       ( MonadPlus(..) )
+import Control.Monad       ( MonadPlus(..), liftM )
 -- import Control.Monad.State ( MonadState(..), StateT, evalStateT )
 import Control.Monad.Trans ( MonadTrans(..), MonadIO(..) )
 
@@ -47,7 +47,7 @@
 
 evalS :: Monad m => S m a -> m a
 -- evalS m = evalStateT m emptyStore
-evalS m = CPS.runLazy m
+evalS = CPS.runLazy
 
 -- using 'CPS.Lazy' instead of 'StateT Store' is almost twice as fast.
 
@@ -60,7 +60,7 @@
 
 
 gnf :: (Monad m, Shareable (Lazy m) a) => Lazy m a -> S (Lazy m) a
-gnf a = hnf a >>= shareArgs (\b -> gnf b >>= return . return)
+gnf a = hnf a >>= shareArgs (liftM return . gnf)
 
 hnf :: Monad m => Lazy m a -> S (Lazy m) a
 hnf m = run =<< lift (lift (fromLazy m))
@@ -107,7 +107,7 @@
 -- 'Lazy t' is a monad transformer.
 instance MonadTrans Lazy
  where
-  lift a = Lazy (a >>= return . Lifted)
+  lift = Lazy . liftM Lifted
 
 -- If the underlying monad supports IO we can lift this functionality.
 instance MonadIO m => MonadIO (Lazy m)
diff --git a/explicit-sharing.cabal b/explicit-sharing.cabal
--- a/explicit-sharing.cabal
+++ b/explicit-sharing.cabal
@@ -1,5 +1,5 @@
 Name:          explicit-sharing
-Version:       0.5.0
+Version:       0.5.1
 Cabal-Version: >= 1.6
 Synopsis:      Explicit Sharing of Monadic Effects
 Description:   
@@ -20,7 +20,7 @@
 Extra-Source-Files: Test.hs
 
 Library
-  Build-Depends:    base, containers ==0.2.0.0, mtl
+  Build-Depends:    base >= 3 && < 5, containers ==0.2.0.0, mtl
   Exposed-Modules:  Control.Monad.Sharing,
                     Control.Monad.Sharing.Classes,
                     Control.Monad.Sharing.FirstOrder,
