diff --git a/Data/Bimap.hs b/Data/Bimap.hs
--- a/Data/Bimap.hs
+++ b/Data/Bimap.hs
@@ -1,3 +1,9 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
+#if __GLASGOW_HASKELL__ >= 708
+{-# LANGUAGE TypeFamilies #-}
+#endif
+
 {-|
 An implementation of bidirectional maps between values of two
 key types. A 'Bimap' is essentially a bijection between subsets of
@@ -87,6 +93,7 @@
     twisted,
 ) where
 
+import           Control.DeepSeq     (NFData)
 import           Control.Monad.Catch
 
 import           Data.Function       (on)
@@ -95,6 +102,11 @@
 import           Data.Maybe          (fromMaybe)
 import           Data.Typeable
 
+#if __GLASGOW_HASKELL__ >= 708
+import qualified GHC.Exts            as GHCExts
+#endif
+import           GHC.Generics        (Generic)
+
 import           Prelude             hiding (filter, lookup, null, pred)
 import qualified Prelude             as P
 
@@ -106,7 +118,7 @@
 {-|
 A bidirectional map between values of types @a@ and @b@.
 -}
-data Bimap a b = MkBimap !(M.Map a b) !(M.Map b a)
+data Bimap a b = MkBimap !(M.Map a b) !(M.Map b a) deriving (Generic)
 
 instance (Show a, Show b) => Show (Bimap a b) where
     show x = "fromList " ++ (show . toList $ x)
@@ -117,6 +129,15 @@
 instance (Ord a, Ord b) => Ord (Bimap a b) where
     compare = compare `on` toAscList
 
+instance (NFData a, NFData b) => NFData (Bimap a b)
+
+#if __GLASGOW_HASKELL__ >= 708
+instance (Ord a, Ord b) => GHCExts.IsList (Bimap a b) where
+    type Item (Bimap a b) = (a, b)
+    fromList = fromList
+    toList = toList
+#endif
+
 {-|
 A 'Bimap' action failed.
 -}
@@ -604,7 +625,7 @@
 /Version: 0.2.2/-}
 deleteMax :: (Ord b) => Bimap a b -> Bimap a b
 deleteMax = snd . deleteFindMax
- 
+
 {-| /O(log n)/.
 Delete the element with maximal right key.
 Calls @'error'@ if the bimap is empty.
@@ -620,7 +641,7 @@
 findMax = M.findMax . toMap
 
 {-| /O(log n)/.
-Find the element with maximal right key. The 
+Find the element with maximal right key. The
 right-hand key is the first entry in the pair.
 Calls @'error'@ if the bimap is empty.
 /Version: 0.2.2/-}
@@ -650,7 +671,7 @@
 /Version: 0.2.2/-}
 deleteMin :: (Ord b) => Bimap a b -> Bimap a b
 deleteMin = snd . deleteFindMin
- 
+
 {-| /O(log n)/.
 Delete the element with minimal right key.
 Calls @'error'@ if the bimap is empty.
@@ -666,10 +687,9 @@
 findMin = M.findMin . toMap
 
 {-| /O(log n)/.
-Find the element with minimal right key. The 
+Find the element with minimal right key. The
 right-hand key is the first entry in the pair.
 Calls @'error'@ if the bimap is empty.
 /Version: 0.2.2/-}
 findMinR :: Bimap a b -> (b, a)
 findMinR = M.findMin . toMapR
-
diff --git a/bimap.cabal b/bimap.cabal
--- a/bimap.cabal
+++ b/bimap.cabal
@@ -1,6 +1,6 @@
 cabal-version:       >= 1.8
 name:                bimap
-version:             0.3.3
+version:             0.4.0
 synopsis:            Bidirectional mapping between two key types
 description:
   A data structure representing a bidirectional mapping between two
@@ -14,12 +14,14 @@
 maintainer:          Joel Williamson <joel@joelwilliamson.ca>
 homepage:            https://github.com/joelwilliamson/bimap
 build-type:          Simple
-tested-with:         GHC <= 7.10.2 && >= 7.0
+tested-with:         GHC <= 8.6.4 && >= 7.0
 extra-source-files:
     HISTORY
 
 Library
-  build-depends:       base >= 4 && <5, containers, exceptions
+  build-depends:       base >= 4 && <5, containers, deepseq, exceptions
+  if impl(ghc < 7.6.1)
+    build-depends: ghc-prim
   extensions:          DeriveDataTypeable
   ghc-options:         -Wall
   exposed-modules:
@@ -32,9 +34,12 @@
                      Test.Util
     build-depends:   base >= 4 && < 5,
                      containers,
+                     deepseq,
                      exceptions,
                      QuickCheck >= 2 && < 3,
                      template-haskell >= 2 && < 3
+    if impl(ghc < 7.6.1)
+      build-depends: ghc-prim
   extensions:        DeriveDataTypeable
 
 source-repository head
