diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,42 @@
-language: haskell
+env:
+ - GHCVER=7.4.2 CABALVER=1.16
+ - GHCVER=7.6.3 CABALVER=1.16
+ - GHCVER=7.8.4 CABALVER=1.18
+ - GHCVER=7.10.1 CABALVER=1.22
+ - GHCVER=head CABALVER=1.22
+
+matrix:
+  allow_failures:
+   - env: GHCVER=head CABALVER=1.22
+
+before_install:
+ - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
+ - travis_retry sudo apt-get update
+ - travis_retry sudo apt-get install cabal-install-$CABALVER ghc-$GHCVER
+ - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
+ - cabal --version
+
+install:
+ - travis_retry cabal update
+ - cabal install --enable-tests --only-dependencies
+
+script:
+ - cabal configure -v2 --enable-tests
+ - cabal build
+ - cabal sdist
+ - export SRC_TGZ=$(cabal info . | awk '{print $2 ".tar.gz";exit}') ;
+   cd dist/;
+   if [ -f "$SRC_TGZ" ]; then
+      cabal install "$SRC_TGZ";
+   else
+      echo "expected '$SRC_TGZ' not found";
+      exit 1;
+   fi
+
 notifications:
   irc:
     channels:
       - "irc.freenode.org#haskell-lens"
     skip_join: true
     template:
-      - "\x0313free\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}"
+      - "\x0313free\x0f/\x0306%{branch}\x0f \x0314%{commit}\x0f %{message} \x0302\x1f%{build_url}\x0f"
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,7 @@
+4.12.1
+------
+* Support GHC 7.4
+
 4.12
 ----
 * Add instances of `MonadCatch` and `MonadThrow` from `exceptions` to `FT`, `FreeT` and `IterT`.
diff --git a/free.cabal b/free.cabal
--- a/free.cabal
+++ b/free.cabal
@@ -1,6 +1,6 @@
 name:          free
 category:      Control, Monads
-version:       4.12
+version:       4.12.1
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -10,6 +10,7 @@
 homepage:      http://github.com/ekmett/free/
 bug-reports:   http://github.com/ekmett/free/issues
 copyright:     Copyright (C) 2008-2015 Edward A. Kmett
+tested-with:   GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1
 synopsis:      Monads for free
 description:
   Free monads are useful for many tree-like structures and domain specific languages.
diff --git a/src/Control/Applicative/Free.hs b/src/Control/Applicative/Free.hs
--- a/src/Control/Applicative/Free.hs
+++ b/src/Control/Applicative/Free.hs
@@ -5,6 +5,10 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 #endif
 {-# OPTIONS_GHC -Wall #-}
+
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Applicative.Free
@@ -40,7 +44,10 @@
 import Control.Applicative
 import Data.Functor.Apply
 import Data.Typeable
+
+#if !(MIN_VERSION_base(4,8,0))
 import Data.Monoid
+#endif
 
 -- | The free 'Applicative' for a 'Functor' @f@.
 data Ap f a where
diff --git a/src/Control/Applicative/Free/Final.hs b/src/Control/Applicative/Free/Final.hs
--- a/src/Control/Applicative/Free/Final.hs
+++ b/src/Control/Applicative/Free/Final.hs
@@ -1,4 +1,9 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE RankNTypes #-}
+
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Applicative.Free.Final
@@ -30,7 +35,10 @@
 
 import Control.Applicative
 import Data.Functor.Apply
+
+#if !(MIN_VERSION_base(4,8,0))
 import Data.Monoid
+#endif
 
 -- | The free 'Applicative' for a 'Functor' @f@.
 newtype Ap f a = Ap { _runAp :: forall g. Applicative g => (forall x. f x -> g x) -> g a }
diff --git a/src/Control/Monad/Free/Class.hs b/src/Control/Monad/Free/Class.hs
--- a/src/Control/Monad/Free/Class.hs
+++ b/src/Control/Monad/Free/Class.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FunctionalDependencies #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -7,6 +8,10 @@
 {-# LANGUAGE TypeFamilies #-}
 #endif
 {-# OPTIONS_GHC -fno-warn-deprecations #-}
+
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.Free.Class
@@ -25,7 +30,6 @@
   , wrapT
   ) where
 
-import Control.Applicative
 import Control.Monad
 import Control.Monad.Trans.Class
 import Control.Monad.Trans.Reader
@@ -40,8 +44,11 @@
 import Control.Monad.Trans.List
 import Control.Monad.Trans.Error
 import Control.Monad.Trans.Identity
--- import Control.Monad.Trans.Either
+
+#if !(MIN_VERSION_base(4,8,0))
+import Control.Applicative
 import Data.Monoid
+#endif
 
 -- |
 -- Monads provide substitution ('fmap') and renormalization ('Control.Monad.join'):
diff --git a/src/Control/Monad/Free/TH.hs b/src/Control/Monad/Free/TH.hs
--- a/src/Control/Monad/Free/TH.hs
+++ b/src/Control/Monad/Free/TH.hs
@@ -1,3 +1,9 @@
+{-# LANGUAGE CPP #-}
+
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Control.Monad.Trans.TH
@@ -27,10 +33,13 @@
   ) where
 
 import Control.Arrow
-import Control.Applicative
 import Control.Monad
 import Data.Char (toLower)
 import Language.Haskell.TH
+
+#if !(MIN_VERSION_base(4,8,0))
+import Control.Applicative
+#endif
 
 data Arg
   = Captured Type Exp
diff --git a/src/Control/Monad/Trans/Free.hs b/src/Control/Monad/Trans/Free.hs
--- a/src/Control/Monad/Trans/Free.hs
+++ b/src/Control/Monad/Trans/Free.hs
@@ -9,6 +9,10 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 #endif
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 #ifndef MIN_VERSION_mtl
 #define MIN_VERSION_mtl(x,y,z) 1
 #endif
@@ -66,7 +70,6 @@
 import Control.Monad.Cont.Class
 import Data.Functor.Bind hiding (join)
 import Data.Monoid
-import Data.Foldable
 import Data.Function (on)
 import Data.Functor.Identity
 import Data.Traversable
@@ -76,6 +79,10 @@
 import Data.Data
 import Prelude.Extras
 
+#if !(MIN_VERSION_base(4,8,0))
+import Data.Foldable
+#endif
+
 -- | The base functor for a free monad.
 data FreeF f a b = Pure a | Free (f b)
   deriving (Eq,Ord,Show,Read
@@ -293,7 +300,8 @@
   {-# INLINE throwM #-}
 
 instance (Functor f, MonadCatch m) => MonadCatch (FreeT f m) where
-  FreeT m `catch` f = FreeT $ liftM (fmap (`catch` f)) m `catch` (runFreeT . f)
+  FreeT m `catch` f = FreeT $ liftM (fmap (`Control.Monad.Catch.catch` f)) m
+                                `Control.Monad.Catch.catch` (runFreeT . f)
   {-# INLINE catch #-}
 
 -- | Tear down a free monad transformer using iteration.
diff --git a/src/Control/Monad/Trans/Free/Church.hs b/src/Control/Monad/Trans/Free/Church.hs
--- a/src/Control/Monad/Trans/Free/Church.hs
+++ b/src/Control/Monad/Trans/Free/Church.hs
@@ -4,6 +4,10 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE UndecidableInstances #-}
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 #ifndef MIN_VERSION_mtl
 #define MIN_VERSION_mtl(x,y,z) 1
 #endif
@@ -63,13 +67,16 @@
 import Control.Monad.Free.Class
 import Control.Monad.Trans.Free (FreeT(..), FreeF(..), Free)
 import qualified Control.Monad.Trans.Free as FreeT
-import Data.Foldable (Foldable)
 import qualified Data.Foldable as F
-import Data.Traversable (Traversable)
 import qualified Data.Traversable as T
 import Data.Functor.Bind hiding (join)
 import Data.Function
 
+#if !(MIN_VERSION_base(4,8,0))
+import Data.Foldable (Foldable)
+import Data.Traversable (Traversable)
+#endif
+
 -- | The \"free monad transformer\" for a functor @f@
 newtype FT f m a = FT { runFT :: forall r. (a -> m r) -> (forall x. (x -> m r) -> f x -> m r) -> m r }
 
@@ -173,7 +180,7 @@
   {-# INLINE throwM #-}
 
 instance (Functor f, MonadCatch m) => MonadCatch (FT f m) where
-  catch m f = toFT $ fromFT m `catch` (fromFT . f)
+  catch m f = toFT $ fromFT m `Control.Monad.Catch.catch` (fromFT . f)
   {-# INLINE catch #-}
 
 -- | Generate a Church-encoded free monad transformer from a 'FreeT' monad
diff --git a/src/Control/Monad/Trans/Iter.hs b/src/Control/Monad/Trans/Iter.hs
--- a/src/Control/Monad/Trans/Iter.hs
+++ b/src/Control/Monad/Trans/Iter.hs
@@ -6,6 +6,10 @@
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 #ifndef MIN_VERSION_mtl
 #define MIN_VERSION_mtl(x,y,z) 1
 #endif
@@ -89,9 +93,7 @@
 import Data.Either
 import Data.Functor.Bind hiding (join)
 import Data.Functor.Identity
-import Data.Foldable hiding (fold)
 import Data.Function (on)
-import Data.Traversable hiding (mapM)
 import Data.Monoid
 import Data.Semigroup.Foldable
 import Data.Semigroup.Traversable
@@ -99,6 +101,11 @@
 import Data.Data
 import Prelude.Extras
 
+#if !(MIN_VERSION_base(4,8,0))
+import Data.Foldable hiding (fold)
+import Data.Traversable hiding (mapM)
+#endif
+
 -- | The monad supporting iteration based over a base monad @m@.
 --
 -- @
@@ -275,7 +282,7 @@
   {-# INLINE throwM #-}
 
 instance MonadCatch m => MonadCatch (IterT m) where
-  catch (IterT m) f = IterT $ liftM (fmap (`catch` f)) m `catch` (runIterT . f)
+  catch (IterT m) f = IterT $ liftM (fmap (`Control.Monad.Catch.catch` f)) m `Control.Monad.Catch.catch` (runIterT . f)
   {-# INLINE catch #-}
 
 -- | Adds an extra layer to a free monad value.
