diff --git a/Control/Monad/ST/Trans.hs b/Control/Monad/ST/Trans.hs
--- a/Control/Monad/ST/Trans.hs
+++ b/Control/Monad/ST/Trans.hs
@@ -2,7 +2,7 @@
     MultiParamTypeClasses, UndecidableInstances, RecursiveDo #-}
 {- |
    Module      :  Control.Monad.ST.Trans
-   Copyright   :  Josef Svenningsson 2008
+   Copyright   :  Josef Svenningsson 2008-2010
                   (c) The University of Glasgow, 1994-2000
    License     :  BSD
  
@@ -50,6 +50,8 @@
 import GHC.Arr (Ix(..), safeRangeSize, safeIndex, 
                 Array(..), arrEleBottom)
 
+import Control.Monad.ST.Trans.Internal
+
 import Control.Monad.Fix
 import Control.Monad.Trans
 import Control.Monad.Error.Class
@@ -63,13 +65,6 @@
 
 import Unsafe.Coerce
 import System.IO.Unsafe
-
-
--- | 'STT' is the monad transformer providing polymorphic updateable references
-newtype STT s m a = STT (State# s -> m (STTRet s a))
-unSTT (STT f) = f
-
-data STTRet s a = STTRet (State# s) a
 
 instance Monad m => Monad (STT s m) where
   return a = STT $ \st -> return (STTRet st a)
diff --git a/Control/Monad/ST/Trans/Internal.hs b/Control/Monad/ST/Trans/Internal.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/ST/Trans/Internal.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances,
+    MultiParamTypeClasses, UndecidableInstances, DoRec #-}
+{- |
+   Module      :  Control.Monad.ST.Trans
+   Copyright   :  Josef Svenningsson 2008-2010
+                  (c) The University of Glasgow, 1994-2000
+   License     :  BSD
+ 
+   Maintainer  :  josef.svenningsson@gmail.com
+   Stability   :  experimental
+   Portability :  non-portable (GHC Extensions)
+
+   This module provides the implementation of the 'STT' type for those
+   occasions where it's needed in order to implement new liftings through
+   operations in other monads.
+
+   Warning! This monad transformer should not be used with monads that
+   can contain multiple answers, like the list monad. The reason is that 
+   the will be duplicated across the different answers and this cause
+   Bad Things to happen (such as loss of referential transparency). Safe 
+   monads include the monads State, Reader, Writer, Maybe and 
+   combinations of their corresponding monad transformers.
+-}
+module Control.Monad.ST.Trans.Internal where
+
+import GHC.Base
+
+-- | 'STT' is the monad transformer providing polymorphic updateable references
+newtype STT s m a = STT (State# s -> m (STTRet s a))
+
+unSTT :: STT s m a -> (State# s -> m (STTRet s a))
+unSTT (STT f) = f
+
+-- | 'STTRet' is needed to encapsulate the unboxed state token that GHC passes
+--   around. This type is essentially a pair, but an ordinary pair is not
+--   not allowed to contain unboxed types.
+data STTRet s a = STTRet (State# s) a
diff --git a/STMonadTrans.cabal b/STMonadTrans.cabal
--- a/STMonadTrans.cabal
+++ b/STMonadTrans.cabal
@@ -1,5 +1,5 @@
 name:		STMonadTrans
-version:	0.2
+version:	0.3
 cabal-version:  >= 1.6
 license:	BSD3
 license-file:	LICENSE
@@ -31,7 +31,9 @@
   else
     build-depends: base < 3
 
-  exposed-modules:	Control.Monad.ST.Trans
+  exposed-modules:	
+    Control.Monad.ST.Trans,
+    Control.Monad.ST.Trans.Internal
   extensions:	MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances, 
         MultiParamTypeClasses, UndecidableInstances
 
