diff -rN -u old-transformers/Control/Monad/Trans/Maybe.hs new-transformers/Control/Monad/Trans/Maybe.hs
--- old-transformers/Control/Monad/Trans/Maybe.hs	2009-11-14 19:38:51.000000000 +0100
+++ new-transformers/Control/Monad/Trans/Maybe.hs	2009-11-14 19:38:51.000000000 +0100
@@ -20,7 +20,7 @@
     liftPass,
   ) where
 
-import Control.Applicative
+import Control.Applicative (Applicative(pure, (<*>)), Alternative(empty, (<|>)), )
 import Control.Monad (MonadPlus(mzero, mplus), liftM, ap)
 import Control.Monad.Trans (MonadIO(liftIO), MonadTrans(lift))
 
diff -rN -u old-transformers/Control/Monad/Trans/RWS/Lazy.hs new-transformers/Control/Monad/Trans/RWS/Lazy.hs
--- old-transformers/Control/Monad/Trans/RWS/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
+++ new-transformers/Control/Monad/Trans/RWS/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
@@ -92,12 +92,14 @@
 
 evalRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (a, w)
 evalRWST m r s = do
-    ~(a, _, w) <- runRWST m r s
+    aw <- runRWST m r s
+    let ~(a, _, w) = aw
     return (a, w)
 
 execRWST :: (Monad m) => RWST r w s m a -> r -> s -> m (s, w)
 execRWST m r s = do
-    ~(_, s', w) <- runRWST m r s
+    sw <- runRWST m r s
+    let ~(_, s', w) = sw
     return (s', w)
 
 mapRWST :: (m (a, s, w) -> n (b, s, w')) -> RWST r w s m a -> RWST r w' s n b
@@ -121,8 +123,10 @@
 instance (Monoid w, Monad m) => Monad (RWST r w s m) where
     return a = RWST $ \_ s -> return (a, s, mempty)
     m >>= k  = RWST $ \r s -> do
-        ~(a, s', w)  <- runRWST m r s
-        ~(b, s'',w') <- runRWST (k a) r s'
+        asw  <- runRWST m r s
+        let ~(a, s', w) = asw
+        bsw <- runRWST (k a) r s'
+        let ~(b, s'',w') = bsw
         return (b, s'', w `mappend` w')
     fail msg = RWST $ \_ _ -> fail msg
 
@@ -163,17 +167,20 @@
 
 listen :: (Monoid w, Monad m) => RWST r w s m a -> RWST r w s m (a, w)
 listen m = RWST $ \r s -> do
-    ~(a, s', w) <- runRWST m r s
+    asw <- runRWST m r s
+    let ~(a, s', w) = asw
     return ((a, w), s', w)
 
 pass :: (Monoid w, Monad m) => RWST r w s m (a, w -> w) -> RWST r w s m a
 pass m = RWST $ \r s -> do
-    ~((a, f), s', w) <- runRWST m r s
+    afsw <- runRWST m r s
+    let ~((a, f), s', w) = afsw
     return (a, s', f w)
 
 listens :: (Monoid w, Monad m) => (w -> b) -> RWST r w s m a -> RWST r w s m (a, b)
 listens f m = do
-    ~(a, w) <- listen m
+    aw <- listen m
+    let ~(a, w) = aw
     return (a, f w)
  
 censor :: (Monoid w, Monad m) => (w -> w) -> RWST r w s m a -> RWST r w s m a
diff -rN -u old-transformers/Control/Monad/Trans/State/Lazy.hs new-transformers/Control/Monad/Trans/State/Lazy.hs
--- old-transformers/Control/Monad/Trans/State/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
+++ new-transformers/Control/Monad/Trans/State/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
@@ -138,13 +138,15 @@
 -- |Similar to 'evalState'
 evalStateT :: (Monad m) => StateT s m a -> s -> m a
 evalStateT m s = do
-    ~(a, _) <- runStateT m s
+    ap <- runStateT m s
+    let ~(a, _) = ap
     return a
 
 -- |Similar to 'execState'
 execStateT :: (Monad m) => StateT s m a -> s -> m s
 execStateT m s = do
-    ~(_, s') <- runStateT m s
+    sp <- runStateT m s
+    let ~(_, s') = sp
     return s'
 
 -- |Similar to 'mapState'
@@ -170,7 +172,8 @@
 instance (Monad m) => Monad (StateT s m) where
     return a = StateT $ \s -> return (a, s)
     m >>= k  = StateT $ \s -> do
-        ~(a, s') <- runStateT m s
+        as <- runStateT m s
+        let ~(a, s') = as
         runStateT (k a) s'
     fail str = StateT $ \_ -> fail str
 
@@ -240,12 +243,14 @@
 liftListen :: Monad m =>
     (m (a,s) -> m ((a,s),w)) -> StateT s m a -> StateT s m (a,w)
 liftListen listen m = StateT $ \s -> do
-    ~((a, s'), w) <- listen (runStateT m s)
+    asw <- listen (runStateT m s)
+    let ~((a, s'), w) = asw
     return ((a, w), s')
 
 -- | Lift a @pass@ operation to the new monad.
 liftPass :: Monad m =>
     (m ((a,s),b) -> m (a,s)) -> StateT s m (a,b) -> StateT s m a
 liftPass pass m = StateT $ \s -> pass $ do
-    ~((a, f), s') <- runStateT m s
+    afs <- runStateT m s
+    let ~((a, f), s') = afs
     return ((a, s'), f)
diff -rN -u old-transformers/Control/Monad/Trans/Writer/Lazy.hs new-transformers/Control/Monad/Trans/Writer/Lazy.hs
--- old-transformers/Control/Monad/Trans/Writer/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
+++ new-transformers/Control/Monad/Trans/Writer/Lazy.hs	2009-11-14 19:38:51.000000000 +0100
@@ -70,9 +70,8 @@
 newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }
 
 execWriterT :: Monad m => WriterT w m a -> m w
-execWriterT m = do
-    ~(_, w) <- runWriterT m
-    return w
+execWriterT m =
+    liftM snd $ runWriterT m
 
 mapWriterT :: (m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
 mapWriterT f m = WriterT $ f (runWriterT m)
@@ -92,8 +91,10 @@
 instance (Monoid w, Monad m) => Monad (WriterT w m) where
     return a = WriterT $ return (a, mempty)
     m >>= k  = WriterT $ do
-        ~(a, w)  <- runWriterT m
-        ~(b, w') <- runWriterT (k a)
+        aw  <- runWriterT m
+        let ~(a, w) = aw
+        bw <- runWriterT (k a)
+        let ~(b, w') = bw
         return (b, w `mappend` w')
     fail msg = WriterT $ fail msg
 
@@ -117,17 +118,20 @@
 
 listen :: (Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w)
 listen m = WriterT $ do
-    ~(a, w) <- runWriterT m
+    aw <- runWriterT m
+    let ~(a, w) = aw
     return ((a, w), w)
 
 pass :: (Monoid w, Monad m) => WriterT w m (a, w -> w) -> WriterT w m a
 pass m = WriterT $ do
-    ~((a, f), w) <- runWriterT m
+    afw <- runWriterT m
+    let ~((a, f), w) = afw
     return (a, f w)
 
 listens :: (Monoid w, Monad m) => (w -> b) -> WriterT w m a -> WriterT w m (a, b)
 listens f m = do
-    ~(a, w) <- listen m
+    aw <- listen m
+    let ~(a, w) = aw
     return (a, f w)
 
 censor :: (Monoid w, Monad m) => (w -> w) -> WriterT w m a -> WriterT w m a
diff -rN -u old-transformers/transformers.cabal new-transformers/transformers.cabal
--- old-transformers/transformers.cabal	2009-11-14 19:38:51.000000000 +0100
+++ new-transformers/transformers.cabal	2009-11-14 19:38:51.000000000 +0100
@@ -27,12 +27,17 @@
   if flag(ApplicativeInBase)
     build-depends: base >= 2
   else
-    build-depends: base >= 1.0 && < 2, special-functors >=1.0 && <1.1
+    build-depends: base >= 1.0 && < 2
+    if impl(jhc)
+      build-depends: applicative >=1.0 && <1.1
+    else
+      build-depends: special-functors >=1.0 && <1.1
   exposed-modules:
     Control.Monad.Identity
     Control.Monad.Trans
     Control.Monad.Trans.Cont
     Control.Monad.Trans.Error
+    Control.Monad.Trans.Identity
     Control.Monad.Trans.List
     Control.Monad.Trans.Maybe
     Control.Monad.Trans.Reader

