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
@@ -1,4 +1,4 @@
-{-# LANGUAGE MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances,
+{-# LANGUAGE CPP, MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances,
     MultiParamTypeClasses, UndecidableInstances, RecursiveDo #-}
 {- |
    Module      :  Control.Monad.ST.Trans
@@ -66,6 +66,11 @@
 import Unsafe.Coerce
 import System.IO.Unsafe
 
+#if __GLASGOW_HASKELL__ < 708
+isTrue# :: Bool -> Bool
+isTrue# x = x
+#endif
+
 instance Monad m => Monad (STT s m) where
   return a = STT $ \st -> return (STTRet st a)
   STT m >>= k = STT $ \st -> 
@@ -122,7 +127,7 @@
       st2 -> return (STTRet st2 ())
 
 instance Eq (STRef s a) where
-  STRef v1 == STRef v2 = sameMutVar# v1 v2
+  STRef v1 == STRef v2 = isTrue# (sameMutVar# v1 v2)
 
 -- | Executes a computation in the 'STT' monad transformer
 runST :: Monad m => (forall s. STT s m a) -> m a
@@ -159,7 +164,7 @@
 data STArray s i e = STArray !i !i !Int (MutableArray# s e)
 
 instance Eq (STArray s i e) where
-  STArray _ _ _ arr1# == STArray _ _ _ arr2# = sameMutableArray# arr1# arr2#
+  STArray _ _ _ arr1# == STArray _ _ _ arr2# = isTrue# (sameMutableArray# arr1# arr2#)
 
 -- | Creates a new mutable array
 newSTArray :: (Ix i, Monad m) => (i,i) -> e -> STT s m (STArray s i e)
@@ -200,8 +205,8 @@
 freezeSTArray :: (Ix i,Monad m) => STArray s i e -> STT s m (Array i e)
 freezeSTArray (STArray l u n@(I# n#) marr#) = STT $ \s1# ->
     case newArray# n# arrEleBottom s1#  of { (# s2#, marr'# #) ->
-    let copy i# s3# | i# ==# n# = s3#
-                    | otherwise =
+    let copy i# s3# | isTrue# (i# ==# n#) = s3#
+                    | otherwise           =
             case readArray# marr# i# s3# of { (# s4#, e #) ->
             case writeArray# marr'# i# e s4# of { s5# ->
             copy (i# +# 1#) s5# }} in
@@ -218,8 +223,8 @@
 thawSTArray :: (Ix i, Monad m) => Array i e -> STT s m (STArray s i e)
 thawSTArray (Array l u n@(I# n#) arr#) = STT $ \s1# ->
     case newArray# n# arrEleBottom s1#  of { (# s2#, marr# #) ->
-    let copy i# s3# | i# ==# n# = s3#
-                    | otherwise =
+    let copy i# s3# | isTrue# (i# ==# n#) = s3#
+                    | otherwise           =
             case indexArray# arr# i#    of { (# e #) ->
             case writeArray# marr# i# e s3# of { s4# ->
             copy (i# +# 1#) s4# }} in
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
@@ -1,5 +1,5 @@
 {-# LANGUAGE MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances,
-    MultiParamTypeClasses, UndecidableInstances, DoRec #-}
+    MultiParamTypeClasses, UndecidableInstances, RecursiveDo #-}
 {- |
    Module      :  Control.Monad.ST.Trans
    Copyright   :  Josef Svenningsson 2008-2010
diff --git a/STMonadTrans.cabal b/STMonadTrans.cabal
--- a/STMonadTrans.cabal
+++ b/STMonadTrans.cabal
@@ -1,5 +1,5 @@
 name:		STMonadTrans
-version:	0.3.1
+version:	0.3.2
 cabal-version:  >= 1.6
 license:	BSD3
 license-file:	LICENSE
@@ -19,8 +19,8 @@
    combinations of their corresponding monad transformers.
 
 source-repository head
-  type:     darcs
-  location: http://patch-tag.com/r/josef/STMonadTrans
+  type:     git
+  location: https://github.com/josefs/STMonadTrans
 
 flag splitBase
   description: Choose the new smaller, split-up base package.
@@ -34,6 +34,6 @@
   exposed-modules:	
     Control.Monad.ST.Trans,
     Control.Monad.ST.Trans.Internal
-  extensions:	MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances, 
+  extensions:	CPP, MagicHash, UnboxedTuples, Rank2Types, FlexibleInstances,
         MultiParamTypeClasses, UndecidableInstances
 
