diff --git a/Data/Csv/Conversion.hs b/Data/Csv/Conversion.hs
--- a/Data/Csv/Conversion.hs
+++ b/Data/Csv/Conversion.hs
@@ -31,8 +31,7 @@
     , namedRecord
     ) where
 
-import Control.Applicative (Alternative, Applicative, (<*>), (<$>), (<|>),
-                            (<*), (*>), empty, pure)
+import Control.Applicative (Alternative, (<$>), (<|>), empty)
 import Control.Monad (MonadPlus, mplus, mzero)
 import Data.Attoparsec.ByteString.Char8 (double)
 import qualified Data.Attoparsec.ByteString.Char8 as A8
@@ -42,21 +41,26 @@
 import qualified Data.HashMap.Lazy as HM
 import Data.Int (Int8, Int16, Int32, Int64)
 import qualified Data.Map as M
-import Data.Monoid (Monoid, mappend, mempty)
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import qualified Data.Text.Lazy as LT
 import qualified Data.Text.Lazy.Encoding as LT
-import Data.Traversable (traverse)
 import Data.Vector (Vector, (!))
 import qualified Data.Vector as V
 import qualified Data.Vector.Unboxed as U
-import Data.Word (Word, Word8, Word16, Word32, Word64)
+import Data.Word (Word8, Word16, Word32, Word64)
 import GHC.Float (double2Float)
 import Prelude hiding (lookup, takeWhile)
 
 import Data.Csv.Conversion.Internal
 import Data.Csv.Types
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative (Applicative, (<*>), (<*), (*>), pure)
+import Data.Monoid (Monoid, mappend, mempty)
+import Data.Traversable (traverse)
+import Data.Word (Word)
+#endif
 
 #ifdef GENERICS
 import GHC.Generics
diff --git a/Data/Csv/Conversion/Internal.hs b/Data/Csv/Conversion/Internal.hs
--- a/Data/Csv/Conversion/Internal.hs
+++ b/Data/Csv/Conversion/Internal.hs
@@ -24,9 +24,10 @@
 -- TODO: Add an optimized version for Integer.
 
 formatDecimal :: Integral a => a -> Builder
-{-# SPECIALIZE formatDecimal :: Int8 -> Builder #-}
 {-# RULES "formatDecimal/Int" formatDecimal = formatBoundedSigned
     :: Int -> Builder #-}
+{-# RULES "formatDecimal/Int8" formatDecimal = formatBoundedSigned
+    :: Int8 -> Builder #-}
 {-# RULES "formatDecimal/Int16" formatDecimal = formatBoundedSigned
     :: Int16 -> Builder #-}
 {-# RULES "formatDecimal/Int32" formatDecimal = formatBoundedSigned
@@ -43,6 +44,7 @@
     :: Word32 -> Builder #-}
 {-# RULES "formatDecimal/Word64" formatDecimal = formatPositive
     :: Word64 -> Builder #-}
+{-# NOINLINE formatDecimal #-}
 formatDecimal i
     | i < 0     = minus <>
                   if i <= -128
diff --git a/Data/Csv/Encoding.hs b/Data/Csv/Encoding.hs
--- a/Data/Csv/Encoding.hs
+++ b/Data/Csv/Encoding.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}
 
 -- Module:      Data.Csv.Encoding
 -- Copyright:   (c) 2011 MailRank, Inc.
@@ -32,7 +32,7 @@
 import Blaze.ByteString.Builder (Builder, fromByteString, fromWord8,
                                  toLazyByteString, toByteString)
 import Blaze.ByteString.Builder.Char8 (fromString)
-import Control.Applicative ((*>), (<|>), optional, pure)
+import Control.Applicative ((<|>), optional)
 import Data.Attoparsec.ByteString.Char8 (endOfInput)
 import qualified Data.Attoparsec.ByteString.Lazy as AL
 import qualified Data.ByteString as B
@@ -40,7 +40,6 @@
 import qualified Data.ByteString.Lazy as L
 import qualified Data.ByteString.Lazy.Char8 as BL8
 import qualified Data.HashMap.Strict as HM
-import Data.Monoid (mconcat, mempty)
 import Data.Vector (Vector)
 import qualified Data.Vector as V
 import Data.Word (Word8)
@@ -55,6 +54,11 @@
 import Data.Csv.Types hiding (toNamedRecord)
 import qualified Data.Csv.Types as Types
 import Data.Csv.Util (blankLine, endOfLine)
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((*>), pure)
+import Data.Monoid (mconcat, mempty)
+#endif
 
 -- TODO: 'encode' isn't as efficient as it could be.
 
diff --git a/Data/Csv/Incremental.hs b/Data/Csv/Incremental.hs
--- a/Data/Csv/Incremental.hs
+++ b/Data/Csv/Incremental.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE BangPatterns, DeriveFunctor #-}
+{-# LANGUAGE BangPatterns, CPP, DeriveFunctor #-}
 
 -- | This module allows for incremental decoding of CSV data. This is
 -- useful if you e.g. want to interleave I\/O with parsing or if you
@@ -27,7 +27,7 @@
     , decodeByNameWith
     ) where
 
-import Control.Applicative ((<*), (<|>))
+import Control.Applicative ((<|>))
 import qualified Data.Attoparsec.ByteString as A
 import Data.Attoparsec.ByteString.Char8 (endOfInput)
 import qualified Data.ByteString as B
@@ -38,6 +38,10 @@
 import Data.Csv.Parser
 import Data.Csv.Types
 import Data.Csv.Util (endOfLine)
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((<*))
+#endif
 
 -- $feed-header
 --
diff --git a/Data/Csv/Parser.hs b/Data/Csv/Parser.hs
--- a/Data/Csv/Parser.hs
+++ b/Data/Csv/Parser.hs
@@ -26,20 +26,24 @@
 
 import Blaze.ByteString.Builder (fromByteString, toByteString)
 import Blaze.ByteString.Builder.Char.Utf8 (fromChar)
-import Control.Applicative ((*>), (<$>), (<*), optional, pure)
+import Control.Applicative ((<$>), optional)
 import Data.Attoparsec.ByteString.Char8 (char, endOfInput)
 import qualified Data.Attoparsec.ByteString as A
 import qualified Data.Attoparsec.Lazy as AL
 import qualified Data.Attoparsec.Zepto as Z
 import qualified Data.ByteString as S
 import qualified Data.ByteString.Unsafe as S
-import Data.Monoid (mappend, mempty)
 import qualified Data.Vector as V
 import Data.Word (Word8)
 
 import Data.Csv.Types
 import Data.Csv.Util ((<$!>), blankLine, endOfLine, liftM2', cr, newline, doubleQuote)
 
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((*>), (<*), pure)
+import Data.Monoid (mappend, mempty)
+#endif
+
 -- | Options that controls how data is decoded. These options can be
 -- used to e.g. decode tab-separated data instead of comma-separated
 -- data.
@@ -84,7 +88,7 @@
         case mb of
             Just b | b == delim -> liftM2' (:) (A.anyWord8 *> p) loop
             _                   -> pure []
-{-# INLINe sepByDelim1' #-}
+{-# INLINE sepByDelim1' #-}
 
 -- | Specialized version of 'sepBy1'' which is faster due to not
 -- accepting an arbitrary separator.
@@ -100,7 +104,7 @@
                    | b == newline ->
                 liftM2' (:) (A.anyWord8 *> p) loop
             _ -> pure []
-{-# INLINe sepByEndOfLine1' #-}
+{-# INLINE sepByEndOfLine1' #-}
 
 -- | Parse a CSV file that includes a header.
 csvWithHeader :: DecodeOptions -> AL.Parser (Header, V.Vector NamedRecord)
diff --git a/Data/Csv/Streaming.hs b/Data/Csv/Streaming.hs
--- a/Data/Csv/Streaming.hs
+++ b/Data/Csv/Streaming.hs
@@ -28,13 +28,12 @@
     , decodeByNameWith
     ) where
 
-import Control.Applicative ((<$>), (<*>), pure)
+import Control.Applicative ((<$>))
 import Control.DeepSeq (NFData(rnf))
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.ByteString.Lazy.Char8 as BL8
 import Data.Foldable (Foldable(..))
-import Data.Traversable (Traversable(..))
 import Prelude hiding (foldr)
 
 import Data.Csv.Conversion
@@ -43,6 +42,11 @@
 import qualified Data.Csv.Incremental as I
 import Data.Csv.Parser
 import Data.Csv.Types
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((<*>), pure)
+import Data.Traversable (Traversable(..))
+#endif
 
 #if !MIN_VERSION_bytestring(0,10,0)
 import qualified Data.ByteString.Lazy.Internal as BL  -- for constructors
diff --git a/Data/Csv/Util.hs b/Data/Csv/Util.hs
--- a/Data/Csv/Util.hs
+++ b/Data/Csv/Util.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}
 
 module Data.Csv.Util
     ( (<$!>)
@@ -10,13 +10,17 @@
     , cr
     ) where
 
-import Control.Applicative ((<|>), (*>))
+import Control.Applicative ((<|>))
 import Data.Word (Word8)
 import Data.Attoparsec.ByteString.Char8 (string)
 import qualified Data.Attoparsec.ByteString as A
 import qualified Data.ByteString as B
 import qualified Data.Vector as V
 import Data.Attoparsec.ByteString (Parser)
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative ((*>))
+#endif
 
 -- | A strict version of 'Data.Functor.<$>' for monads.
 (<$!>) :: Monad m => (a -> b) -> m a -> m b
diff --git a/cassava.cabal b/cassava.cabal
--- a/cassava.cabal
+++ b/cassava.cabal
@@ -1,5 +1,5 @@
 Name:                cassava
-Version:             0.4.2.1
+Version:             0.4.2.2
 Synopsis:            A CSV parsing and encoding library
 Description:
   A CSV parsing and encoding library optimized for ease of use and high
@@ -18,7 +18,6 @@
 Cabal-version:       >=1.8
 Extra-source-files:  examples/*.hs
 
-
 Library
   Exposed-modules:
     Data.Csv
@@ -38,7 +37,7 @@
     array < 0.6,
     attoparsec >= 0.10.2 && < 0.13,
     base < 5,
-    blaze-builder < 0.4,
+    blaze-builder < 0.5,
     bytestring < 0.11,
     containers < 0.6,
     deepseq < 1.5,
@@ -51,7 +50,7 @@
   if impl(ghc >= 7.2.1)
     cpp-options: -DGENERICS
     build-depends: ghc-prim >= 0.2 && < 0.4
-  
+
 Test-suite unit-tests
   Type: exitcode-stdio-1.0
   Main-is: UnitTests.hs
@@ -75,17 +74,43 @@
 Benchmark benchmarks
   Type: exitcode-stdio-1.0
   Main-is: Benchmarks.hs
+
+  Other-modules:
+    Data.Csv
+    Data.Csv.Compat.Monoid
+    Data.Csv.Conversion
+    Data.Csv.Conversion.Internal
+    Data.Csv.Encoding
+    Data.Csv.Incremental
+    Data.Csv.Parser
+    Data.Csv.Streaming
+    Data.Csv.Types
+    Data.Csv.Util
+
   Build-depends:
-    base,
-    bytestring,
-    cassava,
-    criterion,
-    deepseq,
+    array < 0.6,
+    attoparsec >= 0.10.2 && < 0.13,
+    base < 5,
+    blaze-builder < 0.5,
+    bytestring < 0.11,
+    containers < 0.6,
+    criterion >= 1.0,
+    deepseq < 1.5,
     lazy-csv >= 0.5,
+    text < 1.3,
     text,
-    unordered-containers,
-    vector
-  hs-source-dirs: benchmarks
+    unordered-containers < 0.3,
+    vector < 0.11
+
+  ghc-options: -Wall -O2
+
+  if impl(ghc >= 7.2.1)
+    cpp-options: -DGENERICS
+    build-depends: ghc-prim >= 0.2 && < 0.4
+
+  -- We cannot depend on the library directly as that creates a
+  -- dependency cycle.
+  hs-source-dirs: . benchmarks
 
 source-repository head
   type:     git
