diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.1.5
+=====
+
+*   Provide `NFData` instances for all suitable types.
+
 0.1.4
 =====
 
diff --git a/aws-kinesis.cabal b/aws-kinesis.cabal
--- a/aws-kinesis.cabal
+++ b/aws-kinesis.cabal
@@ -17,7 +17,7 @@
 -- under the License.
 
 Name: aws-kinesis
-Version: 0.1.4
+Version: 0.1.5
 Synopsis: Bindings for Amazon Kinesis
 description:
     Bindings for <http://aws.amazon.com/kinesis/ Amazon Kinesis>
@@ -55,7 +55,7 @@
 source-repository this
     type: git
     location: https://github.com/alephcloud/hs-aws-kinesis.git
-    tag: 0.1.4
+    tag: 0.1.5
 
 Library
     default-language: Haskell2010
@@ -80,13 +80,14 @@
         QuickCheck >= 2.7,
         aeson >= 0.7,
         aws >= 0.9,
-        aws-general >= 0.2.1,
+        aws-general >= 0.2.2,
         base == 4.*,
         base64-bytestring >= 1.0,
         blaze-builder >= 0.3,
         bytestring >= 0.10,
         conduit >= 1.1,
         conduit-extra >= 1.1,
+        deepseq >= 1.3,
         http-conduit >= 2.1,
         http-types >= 0.8,
         parsers >= 0.11,
diff --git a/constraints b/constraints
--- a/constraints
+++ b/constraints
@@ -1,37 +1,38 @@
-constraints: QuickCheck ==2.7.6,
+constraints: QuickCheck ==2.8,
              aeson ==0.8.0.2,
-             array ==0.5.0.0,
+             array ==0.5.1.0,
              asn1-encoding ==0.9.0,
              asn1-parse ==0.9.0,
              asn1-types ==0.3.0,
-             async ==2.0.1.6,
-             attoparsec ==0.12.1.2,
+             async ==2.0.2,
+             attoparsec ==0.12.1.5,
              aws ==0.11.2,
-             aws-general ==0.2.1,
-             base ==4.7.0.1,
+             aws-general ==0.2.2,
+             base ==4.8.0.0,
              base16-bytestring ==0.1.1.6,
              base64-bytestring ==1.0.0.1,
-             blaze-builder ==0.3.3.4,
-             blaze-html ==0.7.1.0,
-             blaze-markup ==0.6.3.0,
+             blaze-builder ==0.4.0.1,
+             blaze-html ==0.8.0.2,
+             blaze-markup ==0.7.0.2,
              byteable ==0.1.1,
-             bytestring ==0.10.4.0,
-             case-insensitive ==1.2.0.3,
-             cereal ==0.4.0.1,
+             bytestring ==0.10.6.0,
+             case-insensitive ==1.2.0.4,
+             cereal ==0.4.1.1,
              charset ==0.3.7,
-             cipher-aes ==0.2.8,
+             cipher-aes ==0.2.10,
              cipher-des ==0.0.6,
              cipher-rc4 ==0.1.4,
-             conduit ==1.2.3.1,
-             conduit-extra ==1.1.6.2,
+             clock ==0.4.1.3,
+             conduit ==1.2.4,
+             conduit-extra ==1.1.7.1,
              connection ==0.2.4,
-             containers ==0.5.5.1,
+             containers ==0.5.6.2,
              cookie ==0.4.1.4,
              crypto-cipher-types ==0.0.9,
              crypto-numbers ==0.2.7,
              crypto-pubkey ==0.2.8,
              crypto-pubkey-types ==0.4.3,
-             crypto-random ==0.0.8,
+             crypto-random ==0.0.9,
              cryptohash ==0.11.6,
              data-default ==0.5.3,
              data-default-class ==0.0.1,
@@ -39,66 +40,67 @@
              data-default-instances-containers ==0.0.1,
              data-default-instances-dlist ==0.0.1,
              data-default-instances-old-locale ==0.0.1,
-             deepseq ==1.3.0.2,
-             directory ==1.2.1.0,
-             dlist ==0.7.1,
-             exceptions ==0.6.1,
-             filepath ==1.3.0.2,
-             ghc-prim ==0.3.1.0,
-             hashable ==1.2.3.1,
+             deepseq ==1.4.1.1,
+             directory ==1.2.2.0,
+             dlist ==0.7.1.1,
+             exceptions ==0.8.0.2,
+             filepath ==1.4.0.0,
+             ghc-prim ==0.4.0.0,
+             hashable ==1.2.3.2,
              hourglass ==0.2.8,
-             http-client ==0.4.7.1,
+             http-client ==0.4.9,
              http-client-tls ==0.2.2,
              http-conduit ==2.1.5,
-             http-types ==0.8.5,
-             integer-gmp ==0.5.1.0,
-             lifted-base ==0.2.3.3,
-             mime-types ==0.1.0.5,
+             http-types ==0.8.6,
+             integer-gmp ==1.0.0.0,
+             lifted-base ==0.2.3.6,
+             mime-types ==0.1.0.6,
              mmorph ==1.0.4,
-             monad-control ==1.0.0.1,
+             monad-control ==1.0.0.4,
              mtl ==2.2.1,
              nats ==1,
              network ==2.6.0.2,
              network-uri ==2.6.0.1,
-             old-locale ==1.0.0.6,
-             old-time ==1.1.0.2,
-             parsec ==3.1.7,
+             old-locale ==1.0.0.7,
+             old-time ==1.1.0.3,
+             parsec ==3.1.9,
              parsers ==0.12.1.1,
              pem ==0.2.2,
-             pretty ==1.1.1.1,
-             primitive ==0.5.3.0,
-             process ==1.2.2.0,
+             pretty ==1.1.2.0,
+             primitive ==0.5.4.0,
+             process ==1.2.3.0,
              publicsuffixlist ==0.1,
-             quickcheck-instances ==0.3.10,
+             quickcheck-instances ==0.3.11,
              random ==1.1,
-             resourcet ==1.1.3.3,
+             resourcet ==1.1.4.1,
              rts ==1.0,
-             safe ==0.3.6,
-             scientific ==0.3.3.5,
-             securemem ==0.1.3,
-             semigroups ==0.16.0.1,
+             safe ==0.3.8,
+             scientific ==0.3.3.8,
+             securemem ==0.1.7,
+             semigroups ==0.16.2.2,
              socks ==0.5.4,
-             stm ==2.4.3,
-             streaming-commons ==0.1.9.1,
-             syb ==0.4.2,
-             system-filepath ==0.4.13.1,
-             tagged ==0.7.2,
-             template-haskell ==2.9.0.0,
-             text ==1.2.0.3,
+             stm ==2.4.4,
+             streaming-commons ==0.1.10.0,
+             syb ==0.4.4,
+             system-filepath ==0.4.13.2,
+             tagged ==0.7.3,
+             template-haskell ==2.10.0.0,
+             text ==1.2.0.4,
              tf-random ==0.5,
              time ==1.5.0.1,
              tls ==1.2.16,
-             transformers ==0.4.1.0,
-             transformers-base ==0.4.3,
+             transformers ==0.4.2.0,
+             transformers-base ==0.4.4,
+             transformers-compat ==0.4.0.4,
              unix ==2.7.1.0,
              unordered-containers ==0.2.5.1,
-             utf8-string ==0.3.8,
-             vector ==0.10.11.0,
+             utf8-string ==1,
+             vector ==0.10.12.3,
              void ==0.7,
              x509 ==1.5.0.1,
              x509-store ==1.5.0,
              x509-system ==1.5.0,
              x509-validation ==1.5.1,
-             xml-conduit ==1.2.3.2,
+             xml-conduit ==1.2.3.3,
              xml-types ==0.3.4,
-             zlib ==0.5.4.1
+             zlib ==0.5.4.2
diff --git a/src/Aws/Kinesis/Commands/CreateStream.hs b/src/Aws/Kinesis/Commands/CreateStream.hs
--- a/src/Aws/Kinesis/Commands/CreateStream.hs
+++ b/src/Aws/Kinesis/Commands/CreateStream.hs
@@ -66,6 +66,7 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_CreateStream.html>
 
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE FlexibleInstances #-}
@@ -83,10 +84,14 @@
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 createStreamAction :: KinesisAction
 createStreamAction = KinesisCreateStream
 
@@ -105,8 +110,10 @@
     , createStreamStreamName :: !StreamName
     -- ^ A name to identify the stream.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData CreateStream
+
 instance ToJSON CreateStream where
     toJSON CreateStream{..} = object
         [ "ShardCount" .= createStreamShardCound
@@ -114,8 +121,10 @@
         ]
 
 data CreateStreamResponse = CreateStreamResponse
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData CreateStreamResponse
+
 instance ResponseConsumer r CreateStreamResponse where
     type ResponseMetadata CreateStreamResponse = KinesisMetadata
     responseConsumer _ = kinesisResponseConsumer
@@ -152,5 +161,7 @@
     | CreateStreamResourceInUseException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData CreateStreamExceptions
 
diff --git a/src/Aws/Kinesis/Commands/DeleteStream.hs b/src/Aws/Kinesis/Commands/DeleteStream.hs
--- a/src/Aws/Kinesis/Commands/DeleteStream.hs
+++ b/src/Aws/Kinesis/Commands/DeleteStream.hs
@@ -47,6 +47,7 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_DeleteStream.html>
 
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -64,10 +65,14 @@
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 deleteStreamAction :: KinesisAction
 deleteStreamAction = KinesisDeleteStream
 
@@ -75,16 +80,20 @@
     { deleteStreamStreamName :: !StreamName
     -- ^ The name of the stream to delete.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData DeleteStream
+
 instance ToJSON DeleteStream where
     toJSON DeleteStream{..} = object
         [ "StreamName" .= deleteStreamStreamName
         ]
 
 data DeleteStreamResponse = DeleteStreamResponse
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData DeleteStreamResponse
+
 instance FromJSON DeleteStreamResponse where
     parseJSON _ = return DeleteStreamResponse
 
@@ -118,5 +127,7 @@
     | DeleteStreamResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData DeleteStreamExceptions
 
diff --git a/src/Aws/Kinesis/Commands/DescribeStream.hs b/src/Aws/Kinesis/Commands/DescribeStream.hs
--- a/src/Aws/Kinesis/Commands/DescribeStream.hs
+++ b/src/Aws/Kinesis/Commands/DescribeStream.hs
@@ -50,6 +50,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_DescribeStream.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -63,17 +65,26 @@
 , DescribeStreamExceptions(..)
 ) where
 
-import Control.Applicative
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
 
 import Aws.Core
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+#if ! MIN_VERSION_base(4,8,0)
+import Control.Applicative
+#endif
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Maybe
 import Data.Typeable
 
+import GHC.Generics
+
 describeStreamAction :: KinesisAction
 describeStreamAction = KinesisDescribeStream
 
@@ -87,8 +98,10 @@
     , describeStreamStreamName :: !StreamName
     -- ^ The name of the stream to describe.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData DescribeStream
+
 instance ToJSON DescribeStream where
     toJSON DescribeStream{..} = object
         [ "ExclusiveStartShardId" .= describeStreamExclusiveStartShardId
@@ -102,8 +115,10 @@
     -- shard objects that comprise the stream, and states whether there are
     -- more shards available.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData DescribeStreamResponse
+
 instance ResponseConsumer r DescribeStreamResponse where
     type ResponseMetadata DescribeStreamResponse = KinesisMetadata
     responseConsumer _ = kinesisResponseConsumer
@@ -167,6 +182,7 @@
     | DescribeStreamResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData DescribeStreamExceptions
 
diff --git a/src/Aws/Kinesis/Commands/GetRecords.hs b/src/Aws/Kinesis/Commands/GetRecords.hs
--- a/src/Aws/Kinesis/Commands/GetRecords.hs
+++ b/src/Aws/Kinesis/Commands/GetRecords.hs
@@ -61,6 +61,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_GetRecords.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -74,16 +76,25 @@
 , GetRecordsExceptions(..)
 ) where
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 import Aws.Core
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+#if ! MIN_VERSION_base(4,8,0)
 import Control.Applicative
+#endif
+import Control.DeepSeq
 
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 getRecordsAction :: KinesisAction
 getRecordsAction = KinesisGetRecords
 
@@ -96,8 +107,10 @@
     -- ^ The position in the shard from which you want to start sequentially
     -- reading data records.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData GetRecords
+
 instance ToJSON GetRecords where
     toJSON GetRecords{..} = object
         [ "Limit" .= getRecordsLimit
@@ -113,8 +126,10 @@
     , getRecordsResRecords :: ![Record]
     -- ^ List of Records
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData GetRecordsResponse
+
 instance FromJSON GetRecordsResponse where
     parseJSON = withObject "GetRecordsResponse" $ \o -> GetRecordsResponse
         <$> o .:? "NextShardIterator" .!= Nothing
@@ -166,6 +181,8 @@
     | GetRecordsResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData GetRecordsExceptions
 
 
diff --git a/src/Aws/Kinesis/Commands/GetShardIterator.hs b/src/Aws/Kinesis/Commands/GetShardIterator.hs
--- a/src/Aws/Kinesis/Commands/GetShardIterator.hs
+++ b/src/Aws/Kinesis/Commands/GetShardIterator.hs
@@ -69,6 +69,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_GetShardIterator.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE TypeFamilies #-}
@@ -82,16 +84,25 @@
 , GetShardIteratorExceptions(..)
 ) where
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 import Aws.Core
 import Aws.Kinesis.Types
 import Aws.Kinesis.Core
 
+#if ! MIN_VERSION_base(4,8,0)
 import Control.Applicative
+#endif
+import Control.DeepSeq
 
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 getShardIteratorAction :: KinesisAction
 getShardIteratorAction = KinesisGetShardIterator
 
@@ -110,8 +121,10 @@
     , getShardIteratorStreamName :: !StreamName
     -- ^ The name of the stream.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData GetShardIterator
+
 instance ToJSON GetShardIterator where
     toJSON GetShardIterator{..} = object
         [ "ShardId" .= getShardIteratorShardId
@@ -126,8 +139,10 @@
     -- sequentially. A shard iterator specifies this position using the
     -- sequence number of a data record in a shard.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData GetShardIteratorResponse
+
 instance FromJSON GetShardIteratorResponse where
     parseJSON = withObject "GetShardIteratorResponse" $ \o -> GetShardIteratorResponse
         <$> o .: "ShardIterator"
@@ -165,5 +180,7 @@
     | GetShardIteratorResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData GetShardIteratorExceptions
 
diff --git a/src/Aws/Kinesis/Commands/ListStreams.hs b/src/Aws/Kinesis/Commands/ListStreams.hs
--- a/src/Aws/Kinesis/Commands/ListStreams.hs
+++ b/src/Aws/Kinesis/Commands/ListStreams.hs
@@ -47,6 +47,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_ListStreams.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -60,17 +62,26 @@
 , ListStreamsExceptions(..)
 ) where
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 import Aws.Core
 import Aws.Kinesis.Types
 import Aws.Kinesis.Core
 
+#if ! MIN_VERSION_base(4,8,0)
 import Control.Applicative
+#endif
+import Control.DeepSeq
 
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Maybe
 import Data.Typeable
 
+import GHC.Generics
+
 listStreamsAction :: KinesisAction
 listStreamsAction = KinesisListStreams
 
@@ -81,8 +92,10 @@
     , listStreamsLimit :: !(Maybe Int)
     -- ^ The maximum number of streams to list.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData ListStreams
+
 instance ToJSON ListStreams where
     toJSON ListStreams{..} = object
         [ "ExclusiveStartStreamName" .= listStreamsExclusiveStartStreamName
@@ -97,8 +110,10 @@
     -- ^ The names of the streams that are associated with the AWS account
     -- making the ListStreams request.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData ListStreamsResponse
+
 instance FromJSON ListStreamsResponse where
     parseJSON = withObject "ListStreamsResponse" $ \o -> ListStreamsResponse
         <$> o .: "HasMoreStreams"
@@ -158,5 +173,7 @@
     = ListStreamsLimitExceededException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData ListStreamsExceptions
 
diff --git a/src/Aws/Kinesis/Commands/MergeShards.hs b/src/Aws/Kinesis/Commands/MergeShards.hs
--- a/src/Aws/Kinesis/Commands/MergeShards.hs
+++ b/src/Aws/Kinesis/Commands/MergeShards.hs
@@ -66,6 +66,7 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_MergeShards.html>
 
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -83,10 +84,14 @@
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 mergeShardsAction :: KinesisAction
 mergeShardsAction = KinesisMergeShards
 
@@ -101,8 +106,10 @@
     , mergeShardsStreamName :: !StreamName
     -- ^ The name of the stream for the merge.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData MergeShards
+
 instance ToJSON MergeShards where
     toJSON MergeShards{..} = object
         [ "AdjacentShardToMerge" .= mergeShardsAdjacentShardToMerge
@@ -111,8 +118,10 @@
         ]
 
 data MergeShardsResponse = MergeShardsResponse
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData MergeShardsResponse
+
 instance ResponseConsumer r MergeShardsResponse where
     type ResponseMetadata MergeShardsResponse = KinesisMetadata
     responseConsumer _ = kinesisResponseConsumer
@@ -152,7 +161,7 @@
     | MergeShardsResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
-
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData MergeShardsExceptions
 
diff --git a/src/Aws/Kinesis/Commands/PutRecord.hs b/src/Aws/Kinesis/Commands/PutRecord.hs
--- a/src/Aws/Kinesis/Commands/PutRecord.hs
+++ b/src/Aws/Kinesis/Commands/PutRecord.hs
@@ -62,6 +62,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_PutRecord.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -75,11 +77,18 @@
 , PutRecordExceptions(..)
 ) where
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 import Aws.Core
 import Aws.Kinesis.Types
 import Aws.Kinesis.Core
 
+#if ! MIN_VERSION_base(4,8,0)
 import Control.Applicative
+#endif
+import Control.DeepSeq
 
 import Data.Aeson
 import Data.ByteString as B
@@ -88,6 +97,8 @@
 import qualified Data.Text.Encoding as T
 import Data.Typeable
 
+import GHC.Generics
+
 putRecordAction :: KinesisAction
 putRecordAction = KinesisPutRecord
 
@@ -121,8 +132,10 @@
     , putRecordStreamName :: !StreamName
     -- ^ The name of the stream to put the data record into.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PutRecord
+
 instance ToJSON PutRecord where
     toJSON PutRecord{..} = object
         [ "Data" .= T.decodeUtf8 (B64.encode putRecordData)
@@ -142,8 +155,10 @@
     , putRecordResShardId :: !ShardId
     -- ^ The shard ID of the shard where the data record was placed.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PutRecordResponse
+
 instance FromJSON PutRecordResponse where
     parseJSON = withObject "PutRecordResponse" $ \o -> PutRecordResponse
         <$> o .: "SequenceNumber"
@@ -182,5 +197,7 @@
     | PutRecordResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData PutRecordExceptions
 
diff --git a/src/Aws/Kinesis/Commands/PutRecords.hs b/src/Aws/Kinesis/Commands/PutRecords.hs
--- a/src/Aws/Kinesis/Commands/PutRecords.hs
+++ b/src/Aws/Kinesis/Commands/PutRecords.hs
@@ -81,6 +81,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html>
 
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -97,13 +99,19 @@
 import Aws.Core
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
+
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.ByteString.Base64 as B64
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
+import Data.Typeable
 
+import GHC.Generics
+
 -- | Represents a single record in a 'PutRecords' request.
 --
 data PutRecordsRequestEntry = PutRecordsRequestEntry
@@ -118,8 +126,11 @@
     , putRecordsRequestEntryPartitionKey :: !PartitionKey
     -- ^ Determines which shard in the stream the data record is assigned to.
     -- All data records with the same partition key map to the same shard.
-    } deriving Show
+    }
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PutRecordsRequestEntry
+
 -- | The body of the 'PutRecords' request.
 --
 data PutRecords = PutRecords
@@ -129,8 +140,11 @@
 
     , putRecordsStreamName :: !StreamName
     -- ^ The stream name associated with the request.
-    } deriving Show
+    }
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PutRecords
+
 -- | Represents the result for a single record in a 'PutRecordsResponse'.
 --
 data PutRecordsResponseRecord = PutRecordsResponseRecord
@@ -145,8 +159,11 @@
 
     , putRecordsResponseRecordShardId :: !(Maybe ShardId)
     -- ^ The shard ID assigned to the (successfully processed) record.
-    } deriving Show
+    }
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PutRecordsResponseRecord
+
 data PutRecordsResponse = PutRecordsResponse
     { putRecordsResponseFailedRecordCount :: !Int
     -- ^ The number of unsuccessfully processed records in a 'PutRecords'
@@ -155,7 +172,10 @@
     , putRecordsResponseRecords :: ![PutRecordsResponseRecord]
     -- ^ An array of successfully and unsuccessfully processed records,
     -- correlated with the request by natural ordering.
-    } deriving Show
+    }
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
+
+instance NFData PutRecordsResponse
 
 instance ToJSON PutRecordsRequestEntry where
     toJSON PutRecordsRequestEntry{..} = object $
diff --git a/src/Aws/Kinesis/Commands/SplitShard.hs b/src/Aws/Kinesis/Commands/SplitShard.hs
--- a/src/Aws/Kinesis/Commands/SplitShard.hs
+++ b/src/Aws/Kinesis/Commands/SplitShard.hs
@@ -74,6 +74,7 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_SplitShard.html>
 
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE DeriveDataTypeable #-}
@@ -91,10 +92,14 @@
 import Aws.Kinesis.Core
 import Aws.Kinesis.Types
 
+import Control.DeepSeq
+
 import Data.Aeson
 import qualified Data.ByteString.Lazy as LB
 import Data.Typeable
 
+import GHC.Generics
+
 splitShardAction :: KinesisAction
 splitShardAction = KinesisSplitShard
 
@@ -115,8 +120,10 @@
     , splitShardStreamName :: !StreamName
     -- ^ The name of the stream for the shard split.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData SplitShard
+
 instance ToJSON SplitShard where
     toJSON SplitShard{..} = object
         [ "NewStartingHashKey" .= splitShardNewStartingHashKey
@@ -125,8 +132,10 @@
         ]
 
 data SplitShardResponse = SplitShardResponse
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData SplitShardResponse
+
 instance ResponseConsumer r SplitShardResponse where
     type ResponseMetadata SplitShardResponse = KinesisMetadata
     responseConsumer _ = kinesisResponseConsumer
@@ -166,5 +175,7 @@
     | SplitShardResourceNotFoundException
     -- ^ /Code 400/
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
+
+instance NFData SplitShardExceptions
 
diff --git a/src/Aws/Kinesis/Core.hs b/src/Aws/Kinesis/Core.hs
--- a/src/Aws/Kinesis/Core.hs
+++ b/src/Aws/Kinesis/Core.hs
@@ -27,6 +27,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference>
 
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE CPP #-}
@@ -76,6 +78,7 @@
 import qualified Blaze.ByteString.Builder as BB
 
 import Control.Applicative
+import Control.DeepSeq
 import Control.Exception
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Resource (throwM)
@@ -95,6 +98,8 @@
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 
+import GHC.Generics
+
 import qualified Network.HTTP.Types as HTTP
 import qualified Network.HTTP.Conduit as HTTP
 
@@ -103,9 +108,21 @@
 import qualified Text.Parser.Char as P
 import Text.Parser.Combinators ((<?>))
 
+-- -------------------------------------------------------------------------- --
+-- Orphans
+
+deriving instance Generic HTTP.Status
+instance NFData HTTP.Status
+
+-- -------------------------------------------------------------------------- --
+-- Kinesis Version
+
 data KinesisVersion
     = KinesisVersion_2013_12_02
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData KinesisVersion
+
 kinesisTargetVersion :: IsString a => a
 kinesisTargetVersion = "Kinesis_20131202"
 
@@ -123,8 +140,10 @@
     | KinesisPutRecord
     | KinesisPutRecords
     | KinesisSplitShard
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData KinesisAction
+
 kinesisActionToText :: IsString a => KinesisAction -> a
 kinesisActionToText KinesisCreateStream = "CreateStream"
 kinesisActionToText KinesisDeleteStream = "DeleteStream"
@@ -185,8 +204,10 @@
     { kinesisMAmzId2 :: Maybe T.Text
     , kinesisMRequestId :: Maybe T.Text
     }
-    deriving (Show)
+    deriving (Show, Generic)
 
+instance NFData KinesisMetadata
+
 instance Loggable KinesisMetadata where
     toLogText (KinesisMetadata rid id2) =
         "Kinesis: request ID=" <> fromMaybe "<none>" rid
@@ -203,7 +224,7 @@
     { kinesisConfRegion :: Region
     , kinesisConfProtocol :: Protocol
     }
-    deriving (Show)
+    deriving (Show, Typeable)
 
 defaultKinesisConfiguration
     :: Region
@@ -220,8 +241,10 @@
     { kinesisQueryAction :: !KinesisAction
     , kinesisQueryBody :: !(Maybe B.ByteString)
     }
-    deriving (Show, Eq)
+    deriving (Show, Eq, Typeable, Generic)
 
+instance NFData KinesisQuery
+
 -- | Creates a signed query.
 --
 -- Uses AWS Signature V4. All requests are POST requests
@@ -332,8 +355,10 @@
 data KinesisError a
     = KinesisErrorCommon KinesisCommonError
     | KinesisErrorCommand a
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData a => NFData (KinesisError a)
+
 -- | All Kinesis exceptions have HTTP status code 400 and include
 -- a JSON body with an exception type property and a short message.
 --
@@ -347,9 +372,10 @@
         { kinesisOtherErrorStatus :: !HTTP.Status
         , kinesisOtherErrorMessage :: !T.Text
         }
-    deriving (Show, Eq, Ord, Typeable)
+    deriving (Show, Eq, Ord, Typeable, Generic)
 
 instance Exception KinesisErrorResponse
+instance NFData KinesisErrorResponse
 
 -- | This instance captures only the 'KinesisErrorResponse' constructor
 --
@@ -469,8 +495,10 @@
     -- /Code 400/
     --
     | ErrorValidationError
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData KinesisCommonError
+
 -- -------------------------------------------------------------------------- --
 -- Common Parameters
 
@@ -539,4 +567,7 @@
     , kinesisVersion :: KinesisVersion
     -- ^ The API version that the request is written for.
     }
+    deriving (Show, Eq, Read, Ord, Typeable, Generic)
+
+instance NFData KinesisCommonParameters
 
diff --git a/src/Aws/Kinesis/Types.hs b/src/Aws/Kinesis/Types.hs
--- a/src/Aws/Kinesis/Types.hs
+++ b/src/Aws/Kinesis/Types.hs
@@ -30,6 +30,8 @@
 --
 -- <http://docs.aws.amazon.com/kinesis/2013-12-02/APIReference/API_Types.html>
 
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RecordWildCards #-}
@@ -59,9 +61,16 @@
 , Shard(..)
 ) where
 
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(x,y,z) 1
+#endif
+
 import Aws.General
 
+#if ! MIN_VERSION_base(4,8,0)
 import Control.Applicative
+#endif
+import Control.DeepSeq
 
 import Data.Aeson
 import qualified Data.ByteString as B
@@ -73,6 +82,8 @@
 import qualified Data.Text.Read as T
 import Data.Typeable
 
+import GHC.Generics
+
 import Test.QuickCheck
 import Test.QuickCheck.Instances ()
 
@@ -101,8 +112,10 @@
 -- > [a-zA-Z0-9_.-]+
 --
 newtype StreamName = StreamName { streamNameText :: T.Text }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData StreamName
+
 -- | Smart Constructor for 'StreamName' that enforces size constraints.
 --
 -- For static construction you may also use the 'IsString' instance
@@ -137,8 +150,10 @@
 -- Length constraints: Minimum length of 1. Maximum length of 128.
 --
 newtype ShardId = ShardId { shardIdText :: T.Text }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData ShardId
+
 instance ToJSON ShardId where
     toJSON = toJSON . shardIdText
 
@@ -152,8 +167,10 @@
 -- | Opaque sequence number as returned by PutRecord.
 --
 newtype SequenceNumber = SequenceNumber { sequenceNumberText :: T.Text }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData SequenceNumber
+
 instance ToJSON SequenceNumber where
     toJSON = toJSON . sequenceNumberText
 
@@ -179,8 +196,10 @@
 -- seems to indicate that the value is actually unsigned.
 --
 newtype PartitionHash = PartitionHash { partitionHashInteger :: Integer {- FIXME -} }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData PartitionHash
+
 -- | Smart Constructor for 'PartitionHash' that enforces size constraints.
 --
 partitionHash :: Integer -> Either T.Text PartitionHash
@@ -217,8 +236,10 @@
 -- Length constraints: Minimum length of 1. Maximum length of 256.
 --
 newtype PartitionKey = PartitionKey { partitionKeyText :: T.Text }
-    deriving (Show, Read, Eq, Ord, IsString, Typeable)
+    deriving (Show, Read, Eq, Ord, IsString, Typeable, Generic)
 
+instance NFData PartitionKey
+
 partitionKey :: T.Text -> Either T.Text PartitionKey
 partitionKey t
     | T.length t < 1 = Left $ "Illegal PartitionKey " <> sshow t <> "; PartitionKey must be of length at least 1"
@@ -241,8 +262,10 @@
 -- Length constraints: Minimum length of 1. Maximum length of 512.
 --
 newtype ShardIterator = ShardIterator { shardIteratorText :: T.Text }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData ShardIterator
+
 shardIterator :: T.Text -> Either T.Text ShardIterator
 shardIterator t
     | T.length t < 1 = Left $ "Illegal ShardIterator " <> sshow t <> "; ShardIterator must be of length at least 1"
@@ -282,8 +305,10 @@
     -- ^ Start reading just after the most recent record in the shard, so that
     -- you always read the most recent data in the shard.
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData ShardIteratorType
+
 instance ToJSON ShardIteratorType where
     toJSON AtSequenceNumber = "AT_SEQUENCE_NUMBER"
     toJSON AfterSequenceNumber = "AFTER_SEQUENCE_NUMBER"
@@ -326,8 +351,10 @@
     , recordSequenceNumber :: !SequenceNumber
     -- ^ The unique identifier for the record in the Amazon Kinesis stream.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData Record
+
 instance ToJSON Record where
     toJSON Record{..} = object
         [ "Data" .= T.decodeUtf8 (B64.encode recordData)
@@ -375,8 +402,10 @@
     , streamDescriptionStreamStatus :: !StreamStatus
     -- ^ The current status of the stream being described.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
 
+instance NFData StreamDescription
+
 instance ToJSON StreamDescription where
     toJSON StreamDescription{..} = object
         [ "HasMoreShards" .= streamDescriptionHasMoreShards
@@ -425,8 +454,10 @@
     -- ^ Shards in the stream are being merged or split. Read and write
     -- operations continue to work while the stream is in the UPDATING state.
 
-    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
+    deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable, Generic)
 
+instance NFData StreamStatus
+
 instance ToJSON StreamStatus where
     toJSON StreamStatusCreating = "CREATING"
     toJSON StreamStatusDeleting = "DELETING"
@@ -471,7 +502,9 @@
     , shardShardId :: ShardId
     -- ^ The unique identifier of the shard within the Amazon Kinesis stream.
     }
-    deriving (Show, Read, Eq, Ord, Typeable)
+    deriving (Show, Read, Eq, Ord, Typeable, Generic)
+
+instance NFData Shard
 
 instance ToJSON Shard where
     toJSON Shard{..} = object
