diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,6 @@
+0.1.0.1
+-------
+
+* Fix `transformers` lower bound.
+* Remove unused language extensions.
+* GHC 7.8 compatibility.
diff --git a/ether.cabal b/ether.cabal
--- a/ether.cabal
+++ b/ether.cabal
@@ -1,5 +1,5 @@
 name:                ether
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            Monad transformers and classes
 description:
     Ether is a Haskell library that extends @mtl@ and @transformers@ with
@@ -13,7 +13,8 @@
 homepage:            https://int-index.github.io/ether/
 bug-reports:         https://github.com/int-index/ether/issues
 build-type:          Simple
-cabal-version:       >=1.22
+cabal-version:       >=1.18
+extra-source-files:  CHANGELOG.md
 
 source-repository head
 
@@ -52,21 +53,37 @@
 
   other-modules:       Control.Ether.Util
 
-  build-depends:       base >=4.8 && <4.9
-               ,       transformers >=0.4.0.3
+  build-depends:       base >=4.7 && <4.9
+               ,       transformers >=0.4.2
                ,       mtl >=2.2.1
-               ,       template-haskell >=2.10
+               ,       template-haskell >=2.9
                ,       newtype-generics >=0.4.1
 
-  hs-source-dirs:      src
   default-language:    Haskell2010
+  other-extensions:    DeriveGeneric
+                       MultiParamTypeClasses
+                       TypeFamilies
+                       FlexibleInstances
+                       UndecidableInstances
+                       DataKinds
+                       GeneralizedNewtypeDeriving
+                       FunctionalDependencies
+                       ConstraintKinds
+                       ScopedTypeVariables
+                       TemplateHaskell
+                       PolyKinds
+                       TypeOperators
+                       DefaultSignatures
+                       CPP
+
+  hs-source-dirs:      src
   ghc-options:         -Wall
 
 
 test-suite regression
 
-  build-depends:       base >=4.8 && <4.9
-               ,       transformers >=0.4.0.3
+  build-depends:       base >=4.7 && <4.9
+               ,       transformers >=0.4.2
                ,       mtl >=2.2.1
                ,       tasty >=0.10
                ,       tasty-quickcheck >=0.8
diff --git a/src/Control/Ether/Tagged.hs b/src/Control/Ether/Tagged.hs
--- a/src/Control/Ether/Tagged.hs
+++ b/src/Control/Ether/Tagged.hs
@@ -4,7 +4,6 @@
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FunctionalDependencies #-}
diff --git a/src/Control/Ether/Util.hs b/src/Control/Ether/Util.hs
--- a/src/Control/Ether/Util.hs
+++ b/src/Control/Ether/Util.hs
@@ -1,4 +1,6 @@
-{-# LANGUAGE DataKinds, PolyKinds #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE PolyKinds #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE TypeFamilies #-}
 module Control.Ether.Util
@@ -7,12 +9,20 @@
     , liftPass_WriterT
     , type (++)
     , MaybeToList
+    , fmap
     ) where
 
 import qualified Control.Monad.Signatures as Sig
 import qualified Control.Monad.Trans.Except as Trans
 import qualified Control.Monad.Trans.Writer as Trans
+import Prelude hiding (fmap)
 
+#if __GLASGOW_HASKELL__ < 710
+import qualified Control.Monad
+#else
+import qualified Prelude
+#endif
+
 type family (as :: [*]) ++ (bs :: [*]) :: [*] where
     '[] ++ bs = bs
     (a ': as) ++ bs = a ': (as ++ bs)
@@ -35,3 +45,13 @@
 liftPass_WriterT pass m = Trans.WriterT $ pass $ do
     ~((a, f), w) <- Trans.runWriterT m
     return ((a, w), f)
+
+#if __GLASGOW_HASKELL__ < 710
+fmap :: Monad f => (a -> b) -> f a -> f b
+fmap = Control.Monad.liftM 
+#else
+fmap :: Functor f => (a -> b) -> f a -> f b
+fmap = Prelude.fmap 
+#endif
+
+{-# INLINE fmap #-}
diff --git a/src/Control/Ether/Wrapped.hs b/src/Control/Ether/Wrapped.hs
--- a/src/Control/Ether/Wrapped.hs
+++ b/src/Control/Ether/Wrapped.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -28,7 +27,7 @@
     ) where
 
 import Data.Proxy (Proxy(Proxy))
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.IO.Class (MonadIO)
diff --git a/src/Control/Monad/Ether/Except/Class.hs b/src/Control/Monad/Ether/Except/Class.hs
--- a/src/Control/Monad/Ether/Except/Class.hs
+++ b/src/Control/Monad/Ether/Except/Class.hs
@@ -1,21 +1,24 @@
+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
+
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#endif
+
 -- | See "Control.Monad.Except".
 
 module Control.Monad.Ether.Except.Class
     ( MonadExcept(..)
     ) where
+
+#if __GLASGOW_HASKELL__ < 710
+import Data.Monoid
+#endif
 
 import Data.Proxy (Proxy(Proxy))
 import Control.Monad.Trans (lift)
diff --git a/src/Control/Monad/Ether/Implicit/Except/TH.hs b/src/Control/Monad/Ether/Implicit/Except/TH.hs
--- a/src/Control/Monad/Ether/Implicit/Except/TH.hs
+++ b/src/Control/Monad/Ether/Implicit/Except/TH.hs
@@ -10,7 +10,7 @@
 
 -- | Basic building block for 'try'. Runs an 'ExceptT' with a handler.
 try' :: Functor m => ExceptT e m a -> (e -> a) -> m a
-try' m h = either h id <$> runExceptT m
+try' m h = fmap (either h id) (runExceptT m)
 
 -- | Handle @n@ exceptions with supplied handlers.
 --
diff --git a/src/Control/Monad/Ether/Reader/Class.hs b/src/Control/Monad/Ether/Reader/Class.hs
--- a/src/Control/Monad/Ether/Reader/Class.hs
+++ b/src/Control/Monad/Ether/Reader/Class.hs
@@ -1,16 +1,15 @@
+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
+
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#endif
+
 -- | See "Control.Monad.Reader.Class".
 
 module Control.Monad.Ether.Reader.Class
@@ -18,6 +17,10 @@
     , asks
     ) where
 
+#if __GLASGOW_HASKELL__ < 710
+import Data.Monoid
+#endif
+
 import Data.Proxy (Proxy(Proxy))
 import Control.Monad.Trans (lift)
 
@@ -27,6 +30,7 @@
 import qualified Control.Monad.Trans.Ether.Reader as R
 import qualified Control.Monad.Trans.Ether.State.Lazy   as S.L
 import qualified Control.Monad.Trans.Ether.State.Strict as S.S
+import qualified Control.Ether.Util as Util
 
 -- for mtl instances
 import qualified Control.Monad.Trans.Cont          as Trans        (ContT    , liftLocal)
@@ -64,7 +68,7 @@
         -> (r -> a)
         -- ^ The selector function to apply to the environment.
         -> m a
-    reader t f = fmap f (ask t)
+    reader t f = Util.fmap f (ask t)
 
 -- | Retrieves a function of the current environment.
 asks
diff --git a/src/Control/Monad/Ether/State/Class.hs b/src/Control/Monad/Ether/State/Class.hs
--- a/src/Control/Monad/Ether/State/Class.hs
+++ b/src/Control/Monad/Ether/State/Class.hs
@@ -1,16 +1,15 @@
+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
+
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#endif
+
 -- | See "Control.Monad.State.Class".
 
 module Control.Monad.Ether.State.Class
@@ -19,6 +18,10 @@
     , gets
     ) where
 
+#if __GLASGOW_HASKELL__ < 710
+import Data.Monoid
+#endif
+
 import Control.Monad.Trans (lift)
 
 import Control.Monad.Trans.Ether.Reader (ReaderT)
@@ -26,6 +29,7 @@
 import Control.Monad.Trans.Ether.Except (ExceptT)
 import qualified Control.Monad.Trans.Ether.State.Lazy   as S.L
 import qualified Control.Monad.Trans.Ether.State.Strict as S.S
+import qualified Control.Ether.Util as Util
 
 -- for mtl instances
 import qualified Control.Monad.Trans.Cont          as Trans        (ContT)
@@ -66,7 +70,7 @@
 
 -- | Gets specific component of the state, using a projection function supplied.
 gets :: MonadState tag s m => proxy tag -> (s -> a) -> m a
-gets t f = fmap f (get t)
+gets t f = Util.fmap f (get t)
 
 instance {-# OVERLAPPING #-} Monad m => MonadState tag s (S.L.StateT tag s m) where
     get = S.L.get
diff --git a/src/Control/Monad/Ether/Writer/Class.hs b/src/Control/Monad/Ether/Writer/Class.hs
--- a/src/Control/Monad/Ether/Writer/Class.hs
+++ b/src/Control/Monad/Ether/Writer/Class.hs
@@ -1,16 +1,15 @@
+{-# OPTIONS_GHC -fno-warn-unrecognised-pragmas #-}
+
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE RankNTypes #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances #-}
+#endif
+
 -- | See "Control.Monad.Writer.Class".
 
 module Control.Monad.Ether.Writer.Class
@@ -18,6 +17,10 @@
     , listens
     , censor
     ) where
+
+#if __GLASGOW_HASKELL__ < 710
+import Data.Monoid
+#endif
 
 import Data.Proxy (Proxy(Proxy))
 import Control.Monad.Trans (lift)
diff --git a/src/Control/Monad/Trans/Ether/Except.hs b/src/Control/Monad/Trans/Ether/Except.hs
--- a/src/Control/Monad/Trans/Ether/Except.hs
+++ b/src/Control/Monad/Trans/Ether/Except.hs
@@ -2,10 +2,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -- | See "Control.Monad.Trans.Except".
@@ -34,7 +32,7 @@
 import Data.Proxy (Proxy(Proxy))
 import Data.Functor.Identity (Identity(..))
 import Data.Coerce (coerce)
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.Trans.Class (MonadTrans, lift)
diff --git a/src/Control/Monad/Trans/Ether/Reader.hs b/src/Control/Monad/Trans/Ether/Reader.hs
--- a/src/Control/Monad/Trans/Ether/Reader.hs
+++ b/src/Control/Monad/Trans/Ether/Reader.hs
@@ -2,10 +2,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -- | See "Control.Monad.Trans.Reader".
@@ -33,7 +31,7 @@
 import Data.Proxy (Proxy(Proxy))
 import Data.Functor.Identity (Identity(..))
 import Data.Coerce (coerce)
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.Trans.Class (MonadTrans, lift)
diff --git a/src/Control/Monad/Trans/Ether/State/Lazy.hs b/src/Control/Monad/Trans/Ether/State/Lazy.hs
--- a/src/Control/Monad/Trans/Ether/State/Lazy.hs
+++ b/src/Control/Monad/Trans/Ether/State/Lazy.hs
@@ -2,10 +2,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -- | See "Control.Monad.Trans.State.Lazy".
@@ -38,7 +36,7 @@
 import Data.Proxy (Proxy(Proxy))
 import Data.Functor.Identity (Identity(..))
 import Data.Coerce (coerce)
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.Trans.Class (MonadTrans, lift)
diff --git a/src/Control/Monad/Trans/Ether/State/Strict.hs b/src/Control/Monad/Trans/Ether/State/Strict.hs
--- a/src/Control/Monad/Trans/Ether/State/Strict.hs
+++ b/src/Control/Monad/Trans/Ether/State/Strict.hs
@@ -2,10 +2,8 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -- | See "Control.Monad.Trans.State.Strict".
@@ -38,7 +36,7 @@
 import Data.Proxy (Proxy(Proxy))
 import Data.Functor.Identity (Identity(..))
 import Data.Coerce (coerce)
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.Trans.Class (MonadTrans, lift)
diff --git a/src/Control/Monad/Trans/Ether/Writer.hs b/src/Control/Monad/Trans/Ether/Writer.hs
--- a/src/Control/Monad/Trans/Ether/Writer.hs
+++ b/src/Control/Monad/Trans/Ether/Writer.hs
@@ -1,11 +1,10 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 -- | See "Control.Monad.Trans.Writer".
@@ -34,10 +33,14 @@
     , liftPass
     ) where
 
+#if __GLASGOW_HASKELL__ < 710
+import Data.Monoid
+#endif
+
 import Data.Proxy (Proxy(Proxy))
 import Data.Functor.Identity (Identity(..))
 import Data.Coerce (coerce)
-import Control.Applicative (Alternative)
+import Control.Applicative
 import Control.Monad (MonadPlus)
 import Control.Monad.Fix (MonadFix)
 import Control.Monad.Trans.Class (MonadTrans, lift)
diff --git a/test/Regression.hs b/test/Regression.hs
--- a/test/Regression.hs
+++ b/test/Regression.hs
@@ -9,7 +9,7 @@
 
 import Data.Functor.Identity
 import Data.Monoid
-import Data.Foldable
+import Control.Monad
 import Control.Ether.Tagged
 import Control.Ether.TH
 import Control.Ether.Wrapped
@@ -182,7 +182,7 @@
 exceptCore' :: Double -> Double -> String
 exceptCore' a b = runIdentity $ do
     $(try 2)
-        (show <$> exceptCore a b)
+        (liftM show (exceptCore a b))
         (\(NegativeLog (x::Double)) -> "nl: " ++ show x)
         (\DivideByZero -> "dz")
 
@@ -192,7 +192,7 @@
        , MonadWriter Foo (Sum a) m
        ) => [a] -> m ()
 summatorCore xs = do
-    for_ xs $ \x -> do
+    forM_ xs $ \x -> do
         T.tell (Sum x)
         tell foo (Sum 1)
 
@@ -200,10 +200,10 @@
 summatorCore' = runWriter foo . T.execWriterT . summatorCore
 
 wrapState_f :: T.MonadState Int m => m String
-wrapState_f = fmap show T.get
+wrapState_f = liftM show T.get
 
 wrapState_g :: T.MonadState Bool m => m String
-wrapState_g = fmap show T.get
+wrapState_g = liftM show T.get
 
 wrapState_useboth
     :: ( MonadState Foo Int  m
