diff --git a/cgi-utils.cabal b/cgi-utils.cabal
--- a/cgi-utils.cabal
+++ b/cgi-utils.cabal
@@ -1,5 +1,5 @@
 Name: cgi-utils
-Version: 0.1
+Version: 0.2
 Maintainer: Chris Done (chrisdone@gmail.com)
 Author: Chris Done (chrisdone@gmail.com)
 Copyright: 2010 Chris Done
@@ -16,3 +16,5 @@
   Exposed-Modules: Network.CGI.Session
   Hs-Source-Dirs: src
   Build-Depends: base >= 2 && < 4, cgi, random, containers, mtl
+  Extensions: TypeSynonymInstances
+  GHC-Options: -Wall
diff --git a/src/Network/CGI/Session.hs b/src/Network/CGI/Session.hs
--- a/src/Network/CGI/Session.hs
+++ b/src/Network/CGI/Session.hs
@@ -33,6 +33,7 @@
 import System.IO (openBinaryFile,IOMode(ReadMode),hGetBuf,hClose)
 import System.Random (mkStdGen,StdGen,randomRs)
 import qualified Network.CGI as CGI
+import Network.CGI.Monad   (MonadCGI(cgiGet,cgiAddHeader))
 
 --------------------------------------------------------------------------------
 -- Section: Sessions implementation
@@ -42,6 +43,10 @@
 -- | A simple Session monad. Recommend you define your own.
 type SessionM = StateT Session (CGI.CGIT IO)
 
+instance MonadCGI SessionM where
+    cgiAddHeader = (lift .) . cgiAddHeader
+    cgiGet = lift . cgiGet
+
 -- | Initialise a session state and start a F/CGI process. This is a
 --   bit of a pattern so I've included it here for convenience.
 runSessionCGI :: SessionName
@@ -56,7 +61,7 @@
 
 -- | Simple session runner.
 runSession :: Sessions -> SessionM a -> Session -> CGI.CGI a
-runSession sessions = evalStateT
+runSession _ = evalStateT
 
 -- | Session value getter.
 sessionGet :: Read a => String -> SessionM (Maybe a)
@@ -115,15 +120,15 @@
 initSession sessionName var = do
   s <- getSession sessionName var
   case s of
-    Just s  -> return s
+    Just s'  -> return s'
     Nothing -> makeSession sessionName var
 
 -- | Create a new session and update the Mvar.
 makeSession :: SessionName -> Sessions -> CGI.CGI Session
 makeSession sessionName var = do
-  sess <- liftIO $ modifyMVar var $ \state@(id:ids,sessions) ->
-                let session = Session id M.empty
-                    newState = (ids,M.insert id session sessions)
+  sess <- liftIO $ modifyMVar var $ \(id':ids,sessions) ->
+                let session = Session id' M.empty
+                    newState = (ids,M.insert id' session sessions)
                 in return (newState,session)
   CGI.setCookie (CGI.newCookie sessionName $ show $ sess_id sess)
          { CGI.cookiePath = Just "/" }
@@ -133,11 +138,11 @@
 getSession :: SessionName -> Sessions -> CGI.CGI (Maybe Session)
 getSession sessionName var = do
   sId <- CGI.readCookie sessionName
-  (ids,sessions) <- liftIO $ readMVar var
+  (_,sessions) <- liftIO $ readMVar var
   return $ sId >>= flip M.lookup sessions
 
 -- | Update a session in the map.
 updateSession :: Sessions -> Session -> CGI.CGI ()
-updateSession var session@(Session id _) = do
+updateSession var session@(Session id' _) = do
   liftIO $ modifyMVar_ var $ \(ids,sessions) -> do
-    return (ids,M.insert id session sessions)
+    return (ids,M.insert id' session sessions)
