diff --git a/bower-json.cabal b/bower-json.cabal
--- a/bower-json.cabal
+++ b/bower-json.cabal
@@ -1,5 +1,5 @@
 name:                bower-json
-version:             0.8.0
+version:             0.8.1
 synopsis:            Read bower.json from Haskell
 license:             MIT
 license-file:        LICENSE
@@ -28,6 +28,7 @@
   other-modules:     Web.Bower.PackageMeta.Internal
   build-depends:     base >=4 && <5
                    , aeson >=0.6.1.0
+                   , deepseq
                    , aeson-better-errors >= 0.5
                    , unordered-containers
                    , text
diff --git a/src/Web/Bower/PackageMeta/Internal.hs b/src/Web/Bower/PackageMeta/Internal.hs
--- a/src/Web/Bower/PackageMeta/Internal.hs
+++ b/src/Web/Bower/PackageMeta/Internal.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 
 -- | A data type representing the Bower.json package description file, together
 -- with a parser and related functions.
@@ -17,6 +18,8 @@
 import Control.Monad
 import Control.Category ((>>>))
 import Control.Monad.Error.Class (MonadError(..))
+import Control.DeepSeq
+import GHC.Generics
 import Data.Monoid
 import Data.List
 import Data.Char
@@ -56,13 +59,17 @@
   , bowerResolutions     :: [(PackageName, Version)]
   , bowerPrivate         :: Bool
   }
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData PackageMeta
+
 -- | A valid package name for a Bower package.
 newtype PackageName
   = PackageName String
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData PackageName
+
 runPackageName :: PackageName -> String
 runPackageName (PackageName s) = s
 
@@ -103,8 +110,10 @@
   , authorEmail    :: Maybe String
   , authorHomepage :: Maybe String
   }
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData Author
+
 -- | See: <https://github.com/bower/bower.json-spec#moduletype>
 data ModuleType
   = Globals
@@ -112,8 +121,10 @@
   | Node
   | ES6
   | YUI
-  deriving (Show, Eq, Ord, Enum, Bounded)
+  deriving (Show, Eq, Ord, Enum, Bounded, Generic)
 
+instance NFData ModuleType
+
 moduleTypes :: [(String, ModuleType)]
 moduleTypes = map (\t -> (map toLower (show t), t)) [minBound .. maxBound]
 
@@ -121,21 +132,29 @@
   { repositoryUrl :: String
   , repositoryType :: String
   }
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData Repository
+
 newtype Version
   = Version { runVersion :: String }
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData Version
+
 newtype VersionRange
   = VersionRange { runVersionRange :: String }
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData VersionRange
+
 data BowerError
   = InvalidPackageName PackageNameError
   | InvalidModuleType String
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
 
+instance NFData BowerError
+
 showBowerError :: BowerError -> Text
 showBowerError (InvalidPackageName err) =
   "Invalid package name: " <> showPackageNameError err
@@ -154,7 +173,9 @@
   | RepeatedSeparators
   | MustNotBeginSeparator
   | MustNotEndSeparator
-  deriving (Show, Eq, Ord)
+  deriving (Show, Eq, Ord, Generic)
+
+instance NFData PackageNameError
 
 showPackageNameError :: PackageNameError -> Text
 showPackageNameError err = case err of
