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
@@ -14,10 +14,10 @@
 
    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.
+   the state token will be duplicated across the different answers and
+   this causes 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(
@@ -60,6 +60,7 @@
 import Data.Array.ST hiding (runSTArray)
 import qualified Data.Array.ST as STArray
 
+import Control.Applicative
 import Control.Monad.ST.Trans.Internal
 
 import Data.IORef
@@ -74,15 +75,15 @@
 
 
 -- | Create a new reference
-newSTRef :: Monad m => a -> STT s m (STRef s a)
+newSTRef :: (Applicative m, Monad m) => a -> STT s m (STRef s a)
 newSTRef init = liftST (STRef.newSTRef init)
 
 -- | Reads the value of a reference
-readSTRef :: Monad m => STRef s a -> STT s m a
+readSTRef :: (Applicative m, Monad m) => STRef s a -> STT s m a
 readSTRef ref = liftST (STRef.readSTRef ref)
 
 -- | Modifies the value of a reference
-writeSTRef :: Monad m => STRef s a -> a -> STT s m ()
+writeSTRef :: (Applicative m, Monad m) => STRef s a -> a -> STT s m ()
 writeSTRef ref a = liftST (STRef.writeSTRef ref a)
 
 {-# NOINLINE runST #-}
@@ -103,7 +104,8 @@
 -- Mutable arrays.
 
 -- | Creates a new mutable array
-newSTArray :: (Ix i, Monad m) => (i,i) -> e -> STT s m (STArray s i e)
+newSTArray :: (Ix i, Applicative m, Monad m) =>
+              (i,i) -> e -> STT s m (STArray s i e)
 newSTArray bounds init = liftST (newArray bounds init)
 
 -- | Returns the lowest and highest indices of the array
@@ -115,37 +117,45 @@
 numElementsSTArray = STArray.numElementsSTArray
 
 -- | Retrieves an element from the array
-readSTArray :: (Ix i, Monad m) => STArray s i e -> i -> STT s m e
+readSTArray :: (Ix i, Applicative m, Monad m) =>
+               STArray s i e -> i -> STT s m e
 readSTArray arr i = liftST (readArray arr i)
 
-unsafeReadSTArray :: (Ix i, Monad m) => STArray s i e -> Int -> STT s m e
+unsafeReadSTArray :: (Ix i, Applicative m, Monad m) =>
+                     STArray s i e -> Int -> STT s m e
 unsafeReadSTArray arr i = liftST (STArray.unsafeReadSTArray arr i)
 
 -- | Modifies an element in the array
-writeSTArray :: (Ix i, Monad m) => STArray s i e -> i -> e -> STT s m ()
+writeSTArray :: (Ix i, Applicative m, Monad m) =>
+                STArray s i e -> i -> e -> STT s m ()
 writeSTArray arr i e = liftST (writeArray arr i e)
 
-unsafeWriteSTArray :: (Ix i, Monad m) => STArray s i e -> Int -> e -> STT s m ()
+unsafeWriteSTArray :: (Ix i, Applicative m, Monad m) =>
+                      STArray s i e -> Int -> e -> STT s m ()
 unsafeWriteSTArray arr i e = liftST (STArray.unsafeWriteSTArray arr i e)
 
 -- | Copy a mutable array and turn it into an immutable array
-freezeSTArray :: (Ix i,Monad m) => STArray s i e -> STT s m (Array i e)
+freezeSTArray :: (Ix i, Applicative m, Monad m) =>
+                 STArray s i e -> STT s m (Array i e)
 freezeSTArray arr = liftST (STArray.freezeSTArray arr)
 
-unsafeFreezeSTArray :: (Ix i, Monad m) => STArray s i e -> STT s m (Array i e)
+unsafeFreezeSTArray :: (Ix i, Applicative m, Monad m) =>
+                       STArray s i e -> STT s m (Array i e)
 unsafeFreezeSTArray arr = liftST (STArray.unsafeFreezeSTArray arr)
 
 -- | Copy an immutable array and turn it into a mutable array
-thawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)
+thawSTArray :: (Ix i, Applicative m, Monad m) =>
+               Array i e -> STT s m (STArray s i e)
 thawSTArray arr = liftST (STArray.thawSTArray arr)
 
-unsafeThawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)
+unsafeThawSTArray :: (Ix i, Applicative m, Monad m) =>
+                     Array i e -> STT s m (STArray s i e)
 unsafeThawSTArray arr = liftST (STArray.unsafeThawSTArray arr)
 
 -- | A safe way to create and work with a mutable array before returning an
 -- immutable array for later perusal.  This function avoids copying
 -- the array before returning it.
-runSTArray :: (Ix i, Monad m)
+runSTArray :: (Ix i, Applicative m, Monad m)
            => (forall s . STT s m (STArray s i e))
            -> m (Array i e)
 runSTArray st = runST (st >>= unsafeFreezeSTArray)
diff --git a/Control/Monad/ST/Trans/Internal.hs b/Control/Monad/ST/Trans/Internal.hs
--- a/Control/Monad/ST/Trans/Internal.hs
+++ b/Control/Monad/ST/Trans/Internal.hs
@@ -121,7 +121,7 @@
 
 -- MArray instances
 
-instance Monad m => MArray (STArray s) e (STT s m) where
+instance (Applicative m, Monad m) => MArray (STArray s) e (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -133,7 +133,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Bool (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Bool (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -145,7 +145,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Char (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Char (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -157,7 +157,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Int (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Int (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -169,7 +169,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Word (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Word (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -181,7 +181,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) (Ptr a) (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) (Ptr a) (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -193,7 +193,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) (FunPtr a) (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) (FunPtr a) (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -205,7 +205,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Float (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Float (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -217,7 +217,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Double (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Double (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -229,7 +229,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) (StablePtr a) (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) (StablePtr a) (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -241,7 +241,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Int8 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Int8 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -253,7 +253,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Int16 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Int16 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -265,7 +265,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Int32 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Int32 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -277,7 +277,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Int64 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Int64 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -289,7 +289,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Word8 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Word8 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -301,7 +301,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Word16 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Word16 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -313,7 +313,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Word32 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Word32 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
@@ -325,7 +325,7 @@
     {-# INLINE unsafeWrite #-}
     unsafeWrite arr i e = liftST (unsafeWrite arr i e)
 
-instance Monad m => MArray (STUArray s) Word64 (STT s m) where
+instance (Applicative m, Monad m) => MArray (STUArray s) Word64 (STT s m) where
     {-# INLINE getBounds #-}
     getBounds arr = liftST (getBounds arr)
     {-# INLINE getNumElements #-}
diff --git a/STMonadTrans.cabal b/STMonadTrans.cabal
--- a/STMonadTrans.cabal
+++ b/STMonadTrans.cabal
@@ -1,5 +1,5 @@
 name:		STMonadTrans
-version:	0.4
+version:	0.4.1
 cabal-version:  >= 1.8
 license:	BSD3
 license-file:	LICENSE
@@ -13,10 +13,13 @@
 
    Warning! This monad transformer should not be used with monads that
    can contain multiple answers, like the list monad. The reason is that 
-   the state token will be duplicated across the different answers and this causes
-   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.
+   the state token will be duplicated across the different answers and
+   this causes 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.
+
+extra-source-files:
+        changelog.md
 
 source-repository head
   type:     git
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,10 @@
+0.4.1
+
+  * Add Applicative constraints to be compatible with GHC 7.8.4
+  * Add changelog
+
+0.4
+
+  * New library structure, based on liftST. It reuses more code and
+    types from the standard ST monad. Thanks to @wyager for liftST.
+  * Instances for MArray
