diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,68 @@
+## Version 0.4.5.0
+
+ * Support for GHC 8.0 added; support for GHC 7.4 dropped
+
+ * Fix defect in `Foldable(foldr)` implementation failing to skip
+   unconvertable records (#102)
+
+ * Documentation fixes
+
+ * Maintainer changed
+
+## Version 0.4.4.0
+
+ * Added record instances for larger tuples.
+
+ * Support attoparsec 0.13.
+
+ * Add field instances for short bytestrings.
+
+## Version 0.4.3.0
+
+ * Documentation overhaul with more examples.
+
+ * Add Data.Csv.Builder, a low-level bytestring builder API.
+
+ * Add a high-level builder API to Data.Csv.Incremental.
+
+ * Generalize the default FromNamedRecord/ToNamedRecord instances.
+
+ * Improved support for deriving instances using GHC.Generics.
+
+ * Added some control over quoting.
+
+## Version 0.4.2.4
+
+ * Support attoparsec 0.13.
+
+## Version 0.4.2.3
+
+ * Support GHC 7.10.
+
+## Version 0.4.2.2
+
+ * Support blaze-builder 0.4.
+
+ * Make sure inlining doesn't prevent rules from firing.
+
+ * Fix incorrect INLINE pragmas.
+
+## Version 0.4.2.1
+
+ * Support deepseq-1.4.
+
+## Version 0.4.2.0
+
+ * Minor performance improvements.
+
+ * Add 8 and 9 tuple instances for From/ToRecord.
+
+ * Support text-1.2.
+
+## Version 0.4.1.0
+
+ * Ignore whitespace when converting numeric fields.
+
+ * Accept \r as a line terminator.
+
+ * Support attoparsec-0.12.
diff --git a/Data/Csv.hs b/Data/Csv.hs
--- a/Data/Csv.hs
+++ b/Data/Csv.hs
@@ -26,7 +26,7 @@
     -- * Treating CSV data as opaque byte strings
     -- $generic-processing
 
-    -- * Custom type conversions
+    -- * Custom type conversions for fields
     -- $customtypeconversions
 
     -- ** Dealing with bad data
@@ -37,7 +37,6 @@
       HasHeader(..)
     , decode
     , decodeByName
-    , Quoting(..)
     , encode
     , encodeByName
     , encodeDefaultOrderedByName
@@ -50,6 +49,7 @@
     , decodeWith
     , decodeByNameWith
     , EncodeOptions(..)
+    , Quoting(..)
     , defaultEncodeOptions
     , encodeWith
     , encodeByNameWith
@@ -130,7 +130,7 @@
 -- To encode and decode your own data types you need to defined
 -- instances of either 'ToRecord' and 'FromRecord' or 'ToNamedRecord'
 -- and 'FromNamedRecord'. The former is used for encoding/decoding
--- using the column index and the latter using column name.
+-- using the column index and the latter using the column name.
 --
 -- There are two ways to to define these instances, either by manually
 -- defining them or by using GHC generics to derive them automatically.
@@ -170,7 +170,7 @@
 -- Decoding:
 --
 -- > >>> decode NoHeader "John,27\r\n" :: Either String (Vector Person)
--- > Right (["name","salary"],[Person {name = "John", salary = 27}])
+-- > Right [Person {name = "John", salary = 27}]
 --
 
 -- $example-named-instance
@@ -192,11 +192,11 @@
 -- >
 -- > instance FromNamedRecord Person where
 -- >     parseNamedRecord m = Person <$> m .: "name" <*> m .: "salary"
--- > instance ToNamedRecord Person
+-- > instance ToNamedRecord Person where
 -- >     toNamedRecord (Person name salary) = namedRecord [
 -- >         "name" .= name, "salary" .= salary]
--- > instance DefaultOrdered Person
--- >     where headerOrder = header ["name", "salary"]
+-- > instance DefaultOrdered Person where
+-- >     headerOrder _ = header ["name", "salary"]
 --
 -- We can now use e.g. 'encodeDefaultOrderedByName' (or 'encodeByName'
 -- with an explicit header order) and 'decodeByName' to encode and
diff --git a/Data/Csv/Compat/Monoid.hs b/Data/Csv/Compat/Monoid.hs
deleted file mode 100644
--- a/Data/Csv/Compat/Monoid.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-{-# LANGUAGE CPP #-}
-module Data.Csv.Compat.Monoid
-    ( (<>)
-    ) where
-
-import Data.Monoid
-
-#if !MIN_VERSION_base(4,5,0)
-infixr 6 <>
--- | An infix synonym for 'mappend'.
-(<>) :: Monoid m => m -> m -> m
-(<>) = mappend
-{-# INLINE (<>) #-}
-#endif
diff --git a/Data/Csv/Conversion.hs b/Data/Csv/Conversion.hs
--- a/Data/Csv/Conversion.hs
+++ b/Data/Csv/Conversion.hs
@@ -2,17 +2,19 @@
     BangPatterns,
     CPP,
     DefaultSignatures,
+    DataKinds,
+    PolyKinds,
     FlexibleContexts,
     FlexibleInstances,
     KindSignatures,
     MultiParamTypeClasses,
-    OverlappingInstances,
     OverloadedStrings,
     Rank2Types,
     ScopedTypeVariables,
     TypeOperators,
     UndecidableInstances
     #-}
+
 module Data.Csv.Conversion
     (
     -- * Type conversion
@@ -1018,7 +1020,7 @@
 -- lets you compose several field conversions together in such a way
 -- that if any of them fail, the whole record conversion fails.
 newtype Parser a = Parser {
-      unParser :: forall f r.
+      unParser :: forall (f :: * -> *) (r :: *).
                   Failure f r
                -> Success a f r
                -> f r
@@ -1028,7 +1030,9 @@
     m >>= g = Parser $ \kf ks -> let ks' a = unParser (g a) kf ks
                                  in unParser m kf ks'
     {-# INLINE (>>=) #-}
-    return a = Parser $ \_kf ks -> ks a
+    (>>) = (*>)
+    {-# INLINE (>>) #-}
+    return = pure
     {-# INLINE return #-}
     fail msg = Parser $ \kf _ks -> kf msg
     {-# INLINE fail #-}
@@ -1039,7 +1043,7 @@
     {-# INLINE fmap #-}
 
 instance Applicative Parser where
-    pure  = return
+    pure a = Parser $ \_kf ks -> ks a
     {-# INLINE pure #-}
     (<*>) = apP
     {-# INLINE (<*>) #-}
@@ -1067,7 +1071,7 @@
 apP d e = do
   b <- d
   a <- e
-  return (b a)
+  pure (b a)
 {-# INLINE apP #-}
 
 -- | Run a 'Parser', returning either @'Left' errMsg@ or @'Right'
@@ -1200,7 +1204,12 @@
 
 -- | Instance to ensure that you cannot derive DefaultOrdered for
 -- constructors without selectors.
+#if MIN_VERSION_base(4,9,0)
+instance DefaultOrdered (M1 S ('MetaSel 'Nothing srcpk srcstr decstr) a ())
+         => GToNamedRecordHeader (M1 S ('MetaSel 'Nothing srcpk srcstr decstr) a)
+#else
 instance DefaultOrdered (M1 S NoSelector a ()) => GToNamedRecordHeader (M1 S NoSelector a)
+#endif
   where
     gtoNamedRecordHeader _ =
         error "You cannot derive DefaultOrdered for constructors without selectors."
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
@@ -10,9 +10,8 @@
 import qualified Data.ByteString as B
 import Data.Char (ord)
 import Data.Int
+import Data.Monoid
 import Data.Word
-
-import Data.Csv.Compat.Monoid ((<>))
 
 ------------------------------------------------------------------------
 -- Integers
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, CPP, OverloadedStrings, ScopedTypeVariables #-}
+{-# LANGUAGE BangPatterns, OverloadedStrings, ScopedTypeVariables #-}
 
 -- Module:      Data.Csv.Encoding
 -- Copyright:   (c) 2011 MailRank, Inc.
@@ -40,7 +40,7 @@
 import Blaze.ByteString.Builder (Builder, fromByteString, fromWord8,
                                  toLazyByteString, toByteString)
 import Blaze.ByteString.Builder.Char8 (fromString)
-import Control.Applicative ((<|>), optional)
+import Control.Applicative as AP (Applicative(..), (<|>), optional)
 import Data.Attoparsec.ByteString.Char8 (endOfInput)
 import qualified Data.Attoparsec.ByteString.Lazy as AL
 import qualified Data.ByteString as B
@@ -51,9 +51,9 @@
 import Data.Vector (Vector)
 import qualified Data.Vector as V
 import Data.Word (Word8)
+import Data.Monoid
 import Prelude hiding (unlines)
 
-import Data.Csv.Compat.Monoid ((<>))
 import qualified Data.Csv.Conversion as Conversion
 import Data.Csv.Conversion (FromNamedRecord, FromRecord, ToNamedRecord,
                             ToRecord, parseNamedRecord, parseRecord, runParser,
@@ -64,10 +64,6 @@
 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.
 
@@ -155,11 +151,11 @@
                  -> Either String (Header, Vector a)
 decodeByNameWith !opts = decodeWithP (csvWithHeader opts)
 
--- | Should quoting be applied to fields, and at which level
+-- | Should quoting be applied to fields, and at which level?
 data Quoting
-    = QuoteNone        -- ^ No quotes
-    | QuoteMinimal     -- ^ Quotes according to RFC 4180
-    | QuoteAll         -- ^ Always quote
+    = QuoteNone        -- ^ No quotes.
+    | QuoteMinimal     -- ^ Quotes according to RFC 4180.
+    | QuoteAll         -- ^ Always quote.
     deriving (Eq, Show)
 
 -- | Options that controls how data is encoded. These options can be
@@ -372,7 +368,7 @@
             else case runParser (parseRecord r) of
                 Left msg  -> fail $ "conversion error: " ++ msg
                 Right val -> do
-                    !vals <- (endOfLine *> records) <|> pure []
+                    !vals <- (endOfLine *> records) <|> AP.pure []
                     return (val : vals)
 {-# INLINE csv #-}
 
diff --git a/Data/Csv/Streaming.hs b/Data/Csv/Streaming.hs
--- a/Data/Csv/Streaming.hs
+++ b/Data/Csv/Streaming.hs
@@ -106,6 +106,7 @@
 foldrRecords f = go
   where
     go z (Cons (Right x) rs) = f x (go z rs)
+    go z (Cons (Left _) rs) = go z rs
     go z _ = z
 {-# INLINE foldrRecords #-}
 
diff --git a/benchmarks/Benchmarks.hs b/benchmarks/Benchmarks.hs
--- a/benchmarks/Benchmarks.hs
+++ b/benchmarks/Benchmarks.hs
@@ -4,7 +4,7 @@
 
 module Main ( main ) where
 
-import Control.Applicative
+import Control.Applicative as AP
 import Control.Exception (evaluate)
 import Control.DeepSeq
 import Criterion.Main
@@ -42,7 +42,7 @@
 instance FromRecord President where
     parseRecord v
         | V.length v == 7 = President <$>
-                            v .!! 0 <*>
+                            v .!! 0 AP.<*>
                             v .!! 1 <*>
                             v .!! 2 <*>
                             v .!! 3 <*>
diff --git a/cassava.cabal b/cassava.cabal
--- a/cassava.cabal
+++ b/cassava.cabal
@@ -1,25 +1,44 @@
 Name:                cassava
-Version:             0.4.4.0
+Version:             0.4.5.0
 Synopsis:            A CSV parsing and encoding library
 Description:
   A CSV parsing and encoding library optimized for ease of use and high
   performance.
-Homepage:            https://github.com/tibbe/cassava
+Homepage:            https://github.com/hvr/cassava
 License:             BSD3
 License-file:        LICENSE
-Bug-reports:         https://github.com/tibbe/cassava/issues
+Bug-reports:         https://github.com/hvr/cassava/issues
 Copyright:           (c) 2012 Johan Tibell
                      (c) 2012 Bryan O'Sullivan
                      (c) 2011 MailRank, Inc.
 Author:              Johan Tibell
-Maintainer:          johan.tibell@gmail.com
+Maintainer:          hvr@gnu.org
 Category:            Text, Web, CSV
 Build-type:          Simple
-Cabal-version:       >=1.8
-Extra-source-files:  examples/*.hs
-Tested-with:         GHC == 7.10.2, GHC == 7.8.4, GHC == 7.6.3
+Cabal-version:       >=1.10
+Extra-source-files:  examples/*.hs,
+                     CHANGES.md
+Tested-with:         GHC ==8.0.1, GHC ==7.10.3, GHC ==7.8.4, GHC ==7.6.3
 
 Library
+  default-language: Haskell2010
+  other-extensions:
+    BangPatterns
+    CPP
+    DataKinds
+    DefaultSignatures
+    DeriveFunctor
+    FlexibleContexts
+    FlexibleInstances
+    KindSignatures
+    MultiParamTypeClasses
+    OverloadedStrings
+    PolyKinds
+    Rank2Types
+    ScopedTypeVariables
+    TypeOperators
+    UndecidableInstances
+
   Exposed-modules:
     Data.Csv
     Data.Csv.Builder
@@ -28,7 +47,6 @@
     Data.Csv.Streaming
 
   Other-modules:
-    Data.Csv.Compat.Monoid
     Data.Csv.Conversion
     Data.Csv.Conversion.Internal
     Data.Csv.Encoding
@@ -38,11 +56,11 @@
   Build-depends:
     array < 0.6,
     attoparsec >= 0.10.2 && < 0.14,
-    base >= 4.5 && < 5,
+    base >= 4.6 && < 5,
     blaze-builder < 0.5,
     bytestring < 0.11,
     containers < 0.6,
-    deepseq < 1.5,
+    deepseq >= 1.1 && < 1.5,
     hashable < 1.3,
     text < 1.3,
     unordered-containers < 0.3,
@@ -50,16 +68,14 @@
 
   ghc-options: -Wall -O2
 
-  -- GHC.Generics lived in `ghc-prim` for GHC 7.2 & GHC 7.4 only
-  if impl(ghc < 7.6)
-    build-depends: ghc-prim == 0.2.*
-
 Test-suite unit-tests
+  default-language: Haskell2010
+
   Type: exitcode-stdio-1.0
   Main-is: UnitTests.hs
   Build-depends:
     attoparsec,
-    base >= 4.5,
+    base >= 4.6,
     bytestring,
     cassava,
     hashable < 1.3,
@@ -76,12 +92,13 @@
   ghc-options: -Wall
 
 Benchmark benchmarks
+  default-language: Haskell2010
+
   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
@@ -94,7 +111,7 @@
   Build-depends:
     array < 0.6,
     attoparsec >= 0.10.2 && < 0.14,
-    base >= 4.5 && < 5,
+    base >= 4.6 && < 5,
     blaze-builder < 0.5,
     bytestring < 0.11,
     containers < 0.6,
@@ -109,17 +126,10 @@
 
   ghc-options: -Wall -O2
 
-  if impl(ghc >= 7.2.1)
-    cpp-options: -DGENERICS
-
-    -- GHC.Generics lived in `ghc-prim` for GHC 7.2 & GHC 7.4 only
-    if impl(ghc < 7.6)
-      build-depends: ghc-prim == 0.2.*
-
   -- We cannot depend on the library directly as that creates a
   -- dependency cycle.
   hs-source-dirs: . benchmarks
 
 source-repository head
   type:     git
-  location: https://github.com/tibbe/cassava.git
+  location: https://github.com/hvr/cassava.git
diff --git a/tests/UnitTests.hs b/tests/UnitTests.hs
--- a/tests/UnitTests.hs
+++ b/tests/UnitTests.hs
@@ -13,6 +13,7 @@
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as LT
 import qualified Data.Vector as V
+import qualified Data.Foldable as F
 import Data.Word
 import Test.HUnit
 import Test.Framework as TF
@@ -362,6 +363,21 @@
     ]
 
 ------------------------------------------------------------------------
+-- Instance tests
+
+instanceTests :: [TF.Test]
+instanceTests =
+  [
+    testGroup "Records instances"
+    [ testCase "foldr Foldable" (expected @=? F.foldr (:) [] input)
+    ]
+  ]
+  where
+    input = S.Cons (Left "empty") (
+      S.Cons (Right ("a" :: String)) (S.Nil Nothing BL8.empty))
+    expected = ["a" :: String]
+
+------------------------------------------------------------------------
 -- Test harness
 
 allTests :: [TF.Test]
@@ -369,6 +385,7 @@
            , testGroup "named" nameBasedTests
            , testGroup "conversion" conversionTests
            , testGroup "custom-options" customOptionsTests
+           , testGroup "instances" instanceTests
            ]
 
 main :: IO ()
