diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
 
 ## Version
 
-`1.4.0`
+`1.4.1`
 
 
 ## Description
diff --git a/amazonka-emr.cabal b/amazonka-emr.cabal
--- a/amazonka-emr.cabal
+++ b/amazonka-emr.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-emr
-version:               1.4.0
+version:               1.4.1
 synopsis:              Amazon Elastic MapReduce SDK.
 homepage:              https://github.com/brendanhay/amazonka
 bug-reports:           https://github.com/brendanhay/amazonka/issues
@@ -69,7 +69,7 @@
         , Network.AWS.EMR.Types.Sum
 
     build-depends:
-          amazonka-core == 1.4.0.*
+          amazonka-core == 1.4.1.*
         , base          >= 4.7     && < 5
 
 test-suite amazonka-emr-test
@@ -89,9 +89,9 @@
         , Test.AWS.EMR.Internal
 
     build-depends:
-          amazonka-core == 1.4.0.*
-        , amazonka-test == 1.4.0.*
-        , amazonka-emr == 1.4.0.*
+          amazonka-core == 1.4.1.*
+        , amazonka-test == 1.4.1.*
+        , amazonka-emr == 1.4.1.*
         , base
         , bytestring
         , tasty
diff --git a/gen/Network/AWS/EMR.hs b/gen/Network/AWS/EMR.hs
--- a/gen/Network/AWS/EMR.hs
+++ b/gen/Network/AWS/EMR.hs
@@ -285,6 +285,7 @@
     , igEBSOptimized
     , igMarket
     , igName
+    , igShrinkPolicy
     , igId
 
     -- ** InstanceGroupConfig
@@ -304,6 +305,7 @@
     , instanceGroupModifyConfig
     , igmcInstanceCount
     , igmcEC2InstanceIdsToTerminate
+    , igmcShrinkPolicy
     , igmcInstanceGroupId
 
     -- ** InstanceGroupStateChangeReason
@@ -326,6 +328,13 @@
     , igtCreationDateTime
     , igtEndDateTime
 
+    -- ** InstanceResizePolicy
+    , InstanceResizePolicy
+    , instanceResizePolicy
+    , irpInstancesToProtect
+    , irpInstancesToTerminate
+    , irpInstanceTerminationTimeout
+
     -- ** InstanceStateChangeReason
     , InstanceStateChangeReason
     , instanceStateChangeReason
@@ -381,6 +390,12 @@
     , scriptBootstrapActionConfig
     , sbacArgs
     , sbacPath
+
+    -- ** ShrinkPolicy
+    , ShrinkPolicy
+    , shrinkPolicy
+    , spDecommissionTimeout
+    , spInstanceResizePolicy
 
     -- ** Step
     , Step
diff --git a/gen/Network/AWS/EMR/AddInstanceGroups.hs b/gen/Network/AWS/EMR/AddInstanceGroups.hs
--- a/gen/Network/AWS/EMR/AddInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/AddInstanceGroups.hs
@@ -89,6 +89,8 @@
 
 instance Hashable AddInstanceGroups
 
+instance NFData AddInstanceGroups
+
 instance ToHeaders AddInstanceGroups where
         toHeaders
           = const
@@ -150,3 +152,5 @@
 -- | The response status code.
 aigrsResponseStatus :: Lens' AddInstanceGroupsResponse Int
 aigrsResponseStatus = lens _aigrsResponseStatus (\ s a -> s{_aigrsResponseStatus = a});
+
+instance NFData AddInstanceGroupsResponse
diff --git a/gen/Network/AWS/EMR/AddJobFlowSteps.hs b/gen/Network/AWS/EMR/AddJobFlowSteps.hs
--- a/gen/Network/AWS/EMR/AddJobFlowSteps.hs
+++ b/gen/Network/AWS/EMR/AddJobFlowSteps.hs
@@ -111,6 +111,8 @@
 
 instance Hashable AddJobFlowSteps
 
+instance NFData AddJobFlowSteps
+
 instance ToHeaders AddJobFlowSteps where
         toHeaders
           = const
@@ -164,3 +166,5 @@
 -- | The response status code.
 ajfsrsResponseStatus :: Lens' AddJobFlowStepsResponse Int
 ajfsrsResponseStatus = lens _ajfsrsResponseStatus (\ s a -> s{_ajfsrsResponseStatus = a});
+
+instance NFData AddJobFlowStepsResponse
diff --git a/gen/Network/AWS/EMR/AddTags.hs b/gen/Network/AWS/EMR/AddTags.hs
--- a/gen/Network/AWS/EMR/AddTags.hs
+++ b/gen/Network/AWS/EMR/AddTags.hs
@@ -90,6 +90,8 @@
 
 instance Hashable AddTags
 
+instance NFData AddTags
+
 instance ToHeaders AddTags where
         toHeaders
           = const
@@ -135,3 +137,5 @@
 -- | The response status code.
 atrsResponseStatus :: Lens' AddTagsResponse Int
 atrsResponseStatus = lens _atrsResponseStatus (\ s a -> s{_atrsResponseStatus = a});
+
+instance NFData AddTagsResponse
diff --git a/gen/Network/AWS/EMR/DescribeCluster.hs b/gen/Network/AWS/EMR/DescribeCluster.hs
--- a/gen/Network/AWS/EMR/DescribeCluster.hs
+++ b/gen/Network/AWS/EMR/DescribeCluster.hs
@@ -79,6 +79,8 @@
 
 instance Hashable DescribeCluster
 
+instance NFData DescribeCluster
+
 instance ToHeaders DescribeCluster where
         toHeaders
           = const
@@ -131,3 +133,5 @@
 -- | This output contains the details for the requested cluster.
 dcrsCluster :: Lens' DescribeClusterResponse Cluster
 dcrsCluster = lens _dcrsCluster (\ s a -> s{_dcrsCluster = a});
+
+instance NFData DescribeClusterResponse
diff --git a/gen/Network/AWS/EMR/DescribeStep.hs b/gen/Network/AWS/EMR/DescribeStep.hs
--- a/gen/Network/AWS/EMR/DescribeStep.hs
+++ b/gen/Network/AWS/EMR/DescribeStep.hs
@@ -87,6 +87,8 @@
 
 instance Hashable DescribeStep
 
+instance NFData DescribeStep
+
 instance ToHeaders DescribeStep where
         toHeaders
           = const
@@ -140,3 +142,5 @@
 -- | The response status code.
 dsrsResponseStatus :: Lens' DescribeStepResponse Int
 dsrsResponseStatus = lens _dsrsResponseStatus (\ s a -> s{_dsrsResponseStatus = a});
+
+instance NFData DescribeStepResponse
diff --git a/gen/Network/AWS/EMR/ListBootstrapActions.hs b/gen/Network/AWS/EMR/ListBootstrapActions.hs
--- a/gen/Network/AWS/EMR/ListBootstrapActions.hs
+++ b/gen/Network/AWS/EMR/ListBootstrapActions.hs
@@ -102,6 +102,8 @@
 
 instance Hashable ListBootstrapActions
 
+instance NFData ListBootstrapActions
+
 instance ToHeaders ListBootstrapActions where
         toHeaders
           = const
@@ -165,3 +167,5 @@
 -- | The response status code.
 lbarsResponseStatus :: Lens' ListBootstrapActionsResponse Int
 lbarsResponseStatus = lens _lbarsResponseStatus (\ s a -> s{_lbarsResponseStatus = a});
+
+instance NFData ListBootstrapActionsResponse
diff --git a/gen/Network/AWS/EMR/ListClusters.hs b/gen/Network/AWS/EMR/ListClusters.hs
--- a/gen/Network/AWS/EMR/ListClusters.hs
+++ b/gen/Network/AWS/EMR/ListClusters.hs
@@ -120,6 +120,8 @@
 
 instance Hashable ListClusters
 
+instance NFData ListClusters
+
 instance ToHeaders ListClusters where
         toHeaders
           = const
@@ -184,3 +186,5 @@
 -- | The response status code.
 lcrsResponseStatus :: Lens' ListClustersResponse Int
 lcrsResponseStatus = lens _lcrsResponseStatus (\ s a -> s{_lcrsResponseStatus = a});
+
+instance NFData ListClustersResponse
diff --git a/gen/Network/AWS/EMR/ListInstanceGroups.hs b/gen/Network/AWS/EMR/ListInstanceGroups.hs
--- a/gen/Network/AWS/EMR/ListInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/ListInstanceGroups.hs
@@ -100,6 +100,8 @@
 
 instance Hashable ListInstanceGroups
 
+instance NFData ListInstanceGroups
+
 instance ToHeaders ListInstanceGroups where
         toHeaders
           = const
@@ -162,3 +164,5 @@
 -- | The response status code.
 ligrsResponseStatus :: Lens' ListInstanceGroupsResponse Int
 ligrsResponseStatus = lens _ligrsResponseStatus (\ s a -> s{_ligrsResponseStatus = a});
+
+instance NFData ListInstanceGroupsResponse
diff --git a/gen/Network/AWS/EMR/ListInstances.hs b/gen/Network/AWS/EMR/ListInstances.hs
--- a/gen/Network/AWS/EMR/ListInstances.hs
+++ b/gen/Network/AWS/EMR/ListInstances.hs
@@ -120,6 +120,8 @@
 
 instance Hashable ListInstances
 
+instance NFData ListInstances
+
 instance ToHeaders ListInstances where
         toHeaders
           = const
@@ -183,3 +185,5 @@
 -- | The response status code.
 lirsResponseStatus :: Lens' ListInstancesResponse Int
 lirsResponseStatus = lens _lirsResponseStatus (\ s a -> s{_lirsResponseStatus = a});
+
+instance NFData ListInstancesResponse
diff --git a/gen/Network/AWS/EMR/ListSteps.hs b/gen/Network/AWS/EMR/ListSteps.hs
--- a/gen/Network/AWS/EMR/ListSteps.hs
+++ b/gen/Network/AWS/EMR/ListSteps.hs
@@ -116,6 +116,8 @@
 
 instance Hashable ListSteps
 
+instance NFData ListSteps
+
 instance ToHeaders ListSteps where
         toHeaders
           = const
@@ -140,7 +142,8 @@
 instance ToQuery ListSteps where
         toQuery = const mempty
 
--- | This output contains the list of steps.
+-- | This output contains the list of steps returned in reverse order. This
+-- means that the last step is the first element in the list.
 --
 -- /See:/ 'listStepsResponse' smart constructor.
 data ListStepsResponse = ListStepsResponse'
@@ -179,3 +182,5 @@
 -- | The response status code.
 lsrsResponseStatus :: Lens' ListStepsResponse Int
 lsrsResponseStatus = lens _lsrsResponseStatus (\ s a -> s{_lsrsResponseStatus = a});
+
+instance NFData ListStepsResponse
diff --git a/gen/Network/AWS/EMR/ModifyInstanceGroups.hs b/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
--- a/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
+++ b/gen/Network/AWS/EMR/ModifyInstanceGroups.hs
@@ -73,6 +73,8 @@
 
 instance Hashable ModifyInstanceGroups
 
+instance NFData ModifyInstanceGroups
+
 instance ToHeaders ModifyInstanceGroups where
         toHeaders
           = const
@@ -105,3 +107,5 @@
 modifyInstanceGroupsResponse
     :: ModifyInstanceGroupsResponse
 modifyInstanceGroupsResponse = ModifyInstanceGroupsResponse'
+
+instance NFData ModifyInstanceGroupsResponse
diff --git a/gen/Network/AWS/EMR/RemoveTags.hs b/gen/Network/AWS/EMR/RemoveTags.hs
--- a/gen/Network/AWS/EMR/RemoveTags.hs
+++ b/gen/Network/AWS/EMR/RemoveTags.hs
@@ -91,6 +91,8 @@
 
 instance Hashable RemoveTags
 
+instance NFData RemoveTags
+
 instance ToHeaders RemoveTags where
         toHeaders
           = const
@@ -136,3 +138,5 @@
 -- | The response status code.
 rtrsResponseStatus :: Lens' RemoveTagsResponse Int
 rtrsResponseStatus = lens _rtrsResponseStatus (\ s a -> s{_rtrsResponseStatus = a});
+
+instance NFData RemoveTagsResponse
diff --git a/gen/Network/AWS/EMR/RunJobFlow.hs b/gen/Network/AWS/EMR/RunJobFlow.hs
--- a/gen/Network/AWS/EMR/RunJobFlow.hs
+++ b/gen/Network/AWS/EMR/RunJobFlow.hs
@@ -305,6 +305,8 @@
 
 instance Hashable RunJobFlow
 
+instance NFData RunJobFlow
+
 instance ToHeaders RunJobFlow where
         toHeaders
           = const
@@ -373,3 +375,5 @@
 -- | The response status code.
 rjfrsResponseStatus :: Lens' RunJobFlowResponse Int
 rjfrsResponseStatus = lens _rjfrsResponseStatus (\ s a -> s{_rjfrsResponseStatus = a});
+
+instance NFData RunJobFlowResponse
diff --git a/gen/Network/AWS/EMR/SetTerminationProtection.hs b/gen/Network/AWS/EMR/SetTerminationProtection.hs
--- a/gen/Network/AWS/EMR/SetTerminationProtection.hs
+++ b/gen/Network/AWS/EMR/SetTerminationProtection.hs
@@ -104,6 +104,8 @@
 
 instance Hashable SetTerminationProtection
 
+instance NFData SetTerminationProtection
+
 instance ToHeaders SetTerminationProtection where
         toHeaders
           = const
@@ -139,3 +141,5 @@
 setTerminationProtectionResponse
     :: SetTerminationProtectionResponse
 setTerminationProtectionResponse = SetTerminationProtectionResponse'
+
+instance NFData SetTerminationProtectionResponse
diff --git a/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs b/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
--- a/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
+++ b/gen/Network/AWS/EMR/SetVisibleToAllUsers.hs
@@ -89,6 +89,8 @@
 
 instance Hashable SetVisibleToAllUsers
 
+instance NFData SetVisibleToAllUsers
+
 instance ToHeaders SetVisibleToAllUsers where
         toHeaders
           = const
@@ -123,3 +125,5 @@
 setVisibleToAllUsersResponse
     :: SetVisibleToAllUsersResponse
 setVisibleToAllUsersResponse = SetVisibleToAllUsersResponse'
+
+instance NFData SetVisibleToAllUsersResponse
diff --git a/gen/Network/AWS/EMR/TerminateJobFlows.hs b/gen/Network/AWS/EMR/TerminateJobFlows.hs
--- a/gen/Network/AWS/EMR/TerminateJobFlows.hs
+++ b/gen/Network/AWS/EMR/TerminateJobFlows.hs
@@ -78,6 +78,8 @@
 
 instance Hashable TerminateJobFlows
 
+instance NFData TerminateJobFlows
+
 instance ToHeaders TerminateJobFlows where
         toHeaders
           = const
@@ -108,3 +110,5 @@
 terminateJobFlowsResponse
     :: TerminateJobFlowsResponse
 terminateJobFlowsResponse = TerminateJobFlowsResponse'
+
+instance NFData TerminateJobFlowsResponse
diff --git a/gen/Network/AWS/EMR/Types.hs b/gen/Network/AWS/EMR/Types.hs
--- a/gen/Network/AWS/EMR/Types.hs
+++ b/gen/Network/AWS/EMR/Types.hs
@@ -213,6 +213,7 @@
     , igEBSOptimized
     , igMarket
     , igName
+    , igShrinkPolicy
     , igId
 
     -- * InstanceGroupConfig
@@ -232,6 +233,7 @@
     , instanceGroupModifyConfig
     , igmcInstanceCount
     , igmcEC2InstanceIdsToTerminate
+    , igmcShrinkPolicy
     , igmcInstanceGroupId
 
     -- * InstanceGroupStateChangeReason
@@ -254,6 +256,13 @@
     , igtCreationDateTime
     , igtEndDateTime
 
+    -- * InstanceResizePolicy
+    , InstanceResizePolicy
+    , instanceResizePolicy
+    , irpInstancesToProtect
+    , irpInstancesToTerminate
+    , irpInstanceTerminationTimeout
+
     -- * InstanceStateChangeReason
     , InstanceStateChangeReason
     , instanceStateChangeReason
@@ -310,6 +319,12 @@
     , sbacArgs
     , sbacPath
 
+    -- * ShrinkPolicy
+    , ShrinkPolicy
+    , shrinkPolicy
+    , spDecommissionTimeout
+    , spInstanceResizePolicy
+
     -- * Step
     , Step
     , step
@@ -408,6 +423,8 @@
       | has (hasCode "ThrottlingException" . hasStatus 400) e =
           Just "throttling_exception"
       | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
+      | has (hasStatus 504) e = Just "gateway_timeout"
+      | has (hasStatus 502) e = Just "bad_gateway"
       | has (hasStatus 503) e = Just "service_unavailable"
       | has (hasStatus 500) e = Just "general_server_error"
       | has (hasStatus 509) e = Just "limit_exceeded"
diff --git a/gen/Network/AWS/EMR/Types/Product.hs b/gen/Network/AWS/EMR/Types/Product.hs
--- a/gen/Network/AWS/EMR/Types/Product.hs
+++ b/gen/Network/AWS/EMR/Types/Product.hs
@@ -99,6 +99,8 @@
 
 instance Hashable Application
 
+instance NFData Application
+
 instance ToJSON Application where
         toJSON Application'{..}
           = object
@@ -143,6 +145,8 @@
 
 instance Hashable BootstrapActionConfig
 
+instance NFData BootstrapActionConfig
+
 instance ToJSON BootstrapActionConfig where
         toJSON BootstrapActionConfig'{..}
           = object
@@ -349,6 +353,8 @@
 
 instance Hashable Cluster
 
+instance NFData Cluster
+
 -- | The reason that the cluster changed to its current state.
 --
 -- /See:/ 'clusterStateChangeReason' smart constructor.
@@ -389,6 +395,8 @@
 
 instance Hashable ClusterStateChangeReason
 
+instance NFData ClusterStateChangeReason
+
 -- | The detailed status of the cluster.
 --
 -- /See:/ 'clusterStatus' smart constructor.
@@ -439,6 +447,8 @@
 
 instance Hashable ClusterStatus
 
+instance NFData ClusterStatus
+
 -- | The summary description of the cluster.
 --
 -- /See:/ 'clusterSummary' smart constructor.
@@ -503,6 +513,8 @@
 
 instance Hashable ClusterSummary
 
+instance NFData ClusterSummary
+
 -- | Represents the timeline of the cluster\'s lifecycle.
 --
 -- /See:/ 'clusterTimeline' smart constructor.
@@ -553,6 +565,8 @@
 
 instance Hashable ClusterTimeline
 
+instance NFData ClusterTimeline
+
 -- | An entity describing an executable that runs on a cluster.
 --
 -- /See:/ 'command' smart constructor.
@@ -602,6 +616,8 @@
 
 instance Hashable Command
 
+instance NFData Command
+
 -- | Amazon EMR releases 4.x or later.
 --
 -- Specifies a hardware and software configuration of the EMR cluster. This
@@ -660,6 +676,8 @@
 
 instance Hashable Configuration
 
+instance NFData Configuration
+
 instance ToJSON Configuration where
         toJSON Configuration'{..}
           = object
@@ -711,6 +729,8 @@
 
 instance Hashable EBSBlockDevice
 
+instance NFData EBSBlockDevice
+
 -- | Configuration of requested EBS block device associated with the instance
 -- group with count of volumes that will be associated to every instance.
 --
@@ -749,6 +769,8 @@
 
 instance Hashable EBSBlockDeviceConfig
 
+instance NFData EBSBlockDeviceConfig
+
 instance ToJSON EBSBlockDeviceConfig where
         toJSON EBSBlockDeviceConfig'{..}
           = object
@@ -789,6 +811,8 @@
 
 instance Hashable EBSConfiguration
 
+instance NFData EBSConfiguration
+
 instance ToJSON EBSConfiguration where
         toJSON EBSConfiguration'{..}
           = object
@@ -837,6 +861,8 @@
 
 instance Hashable EBSVolume
 
+instance NFData EBSVolume
+
 -- | Provides information about the EC2 instances in a cluster grouped by
 -- category. For example, key name, subnet ID, IAM instance profile, and so
 -- on.
@@ -955,6 +981,8 @@
 
 instance Hashable EC2InstanceAttributes
 
+instance NFData EC2InstanceAttributes
+
 -- | A job flow step consisting of a JAR file whose main function will be
 -- executed. The main function submits a job for Hadoop to execute and
 -- waits for the job to finish or fail.
@@ -1010,6 +1038,8 @@
 
 instance Hashable HadoopJARStepConfig
 
+instance NFData HadoopJARStepConfig
+
 instance ToJSON HadoopJARStepConfig where
         toJSON HadoopJARStepConfig'{..}
           = object
@@ -1082,6 +1112,8 @@
 
 instance Hashable HadoopStepConfig
 
+instance NFData HadoopStepConfig
+
 -- | Represents an EC2 instance provisioned as part of cluster.
 --
 -- /See:/ 'instance'' smart constructor.
@@ -1185,6 +1217,8 @@
 
 instance Hashable Instance
 
+instance NFData Instance
+
 -- | This entity represents an instance group, which is a group of instances
 -- that have common purpose. For example, CORE instance group is used for
 -- HDFS.
@@ -1202,6 +1236,7 @@
     , _igEBSOptimized           :: !(Maybe Bool)
     , _igMarket                 :: !(Maybe MarketType)
     , _igName                   :: !(Maybe Text)
+    , _igShrinkPolicy           :: !(Maybe ShrinkPolicy)
     , _igId                     :: !(Maybe Text)
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
@@ -1231,6 +1266,8 @@
 --
 -- * 'igName'
 --
+-- * 'igShrinkPolicy'
+--
 -- * 'igId'
 instanceGroup
     :: InstanceGroup
@@ -1247,6 +1284,7 @@
     , _igEBSOptimized = Nothing
     , _igMarket = Nothing
     , _igName = Nothing
+    , _igShrinkPolicy = Nothing
     , _igId = Nothing
     }
 
@@ -1302,6 +1340,10 @@
 igName :: Lens' InstanceGroup (Maybe Text)
 igName = lens _igName (\ s a -> s{_igName = a});
 
+-- | Policy for customizing shrink operations.
+igShrinkPolicy :: Lens' InstanceGroup (Maybe ShrinkPolicy)
+igShrinkPolicy = lens _igShrinkPolicy (\ s a -> s{_igShrinkPolicy = a});
+
 -- | The identifier of the instance group.
 igId :: Lens' InstanceGroup (Maybe Text)
 igId = lens _igId (\ s a -> s{_igId = a});
@@ -1321,10 +1363,13 @@
                      <*> (x .:? "EbsOptimized")
                      <*> (x .:? "Market")
                      <*> (x .:? "Name")
+                     <*> (x .:? "ShrinkPolicy")
                      <*> (x .:? "Id"))
 
 instance Hashable InstanceGroup
 
+instance NFData InstanceGroup
+
 -- | Configuration defining a new instance group.
 --
 -- /See:/ 'instanceGroupConfig' smart constructor.
@@ -1415,6 +1460,8 @@
 
 instance Hashable InstanceGroupConfig
 
+instance NFData InstanceGroupConfig
+
 instance ToJSON InstanceGroupConfig where
         toJSON InstanceGroupConfig'{..}
           = object
@@ -1434,6 +1481,7 @@
 data InstanceGroupModifyConfig = InstanceGroupModifyConfig'
     { _igmcInstanceCount             :: !(Maybe Int)
     , _igmcEC2InstanceIdsToTerminate :: !(Maybe [Text])
+    , _igmcShrinkPolicy              :: !(Maybe ShrinkPolicy)
     , _igmcInstanceGroupId           :: !Text
     } deriving (Eq,Read,Show,Data,Typeable,Generic)
 
@@ -1445,6 +1493,8 @@
 --
 -- * 'igmcEC2InstanceIdsToTerminate'
 --
+-- * 'igmcShrinkPolicy'
+--
 -- * 'igmcInstanceGroupId'
 instanceGroupModifyConfig
     :: Text -- ^ 'igmcInstanceGroupId'
@@ -1453,6 +1503,7 @@
     InstanceGroupModifyConfig'
     { _igmcInstanceCount = Nothing
     , _igmcEC2InstanceIdsToTerminate = Nothing
+    , _igmcShrinkPolicy = Nothing
     , _igmcInstanceGroupId = pInstanceGroupId_
     }
 
@@ -1460,18 +1511,23 @@
 igmcInstanceCount :: Lens' InstanceGroupModifyConfig (Maybe Int)
 igmcInstanceCount = lens _igmcInstanceCount (\ s a -> s{_igmcInstanceCount = a});
 
--- | The EC2 InstanceIds to terminate. For advanced users only. Once you
--- terminate the instances, the instance group will not return to its
--- original requested size.
+-- | The EC2 InstanceIds to terminate. Once you terminate the instances, the
+-- instance group will not return to its original requested size.
 igmcEC2InstanceIdsToTerminate :: Lens' InstanceGroupModifyConfig [Text]
 igmcEC2InstanceIdsToTerminate = lens _igmcEC2InstanceIdsToTerminate (\ s a -> s{_igmcEC2InstanceIdsToTerminate = a}) . _Default . _Coerce;
 
+-- | Policy for customizing shrink operations.
+igmcShrinkPolicy :: Lens' InstanceGroupModifyConfig (Maybe ShrinkPolicy)
+igmcShrinkPolicy = lens _igmcShrinkPolicy (\ s a -> s{_igmcShrinkPolicy = a});
+
 -- | Unique ID of the instance group to expand or shrink.
 igmcInstanceGroupId :: Lens' InstanceGroupModifyConfig Text
 igmcInstanceGroupId = lens _igmcInstanceGroupId (\ s a -> s{_igmcInstanceGroupId = a});
 
 instance Hashable InstanceGroupModifyConfig
 
+instance NFData InstanceGroupModifyConfig
+
 instance ToJSON InstanceGroupModifyConfig where
         toJSON InstanceGroupModifyConfig'{..}
           = object
@@ -1479,6 +1535,7 @@
                  [("InstanceCount" .=) <$> _igmcInstanceCount,
                   ("EC2InstanceIdsToTerminate" .=) <$>
                     _igmcEC2InstanceIdsToTerminate,
+                  ("ShrinkPolicy" .=) <$> _igmcShrinkPolicy,
                   Just ("InstanceGroupId" .= _igmcInstanceGroupId)])
 
 -- | The status change reason details for the instance group.
@@ -1522,6 +1579,8 @@
 
 instance Hashable InstanceGroupStateChangeReason
 
+instance NFData InstanceGroupStateChangeReason
+
 -- | The details of the instance group status.
 --
 -- /See:/ 'instanceGroupStatus' smart constructor.
@@ -1571,6 +1630,8 @@
 
 instance Hashable InstanceGroupStatus
 
+instance NFData InstanceGroupStatus
+
 -- | The timeline of the instance group lifecycle.
 --
 -- /See:/ 'instanceGroupTimeline' smart constructor.
@@ -1621,6 +1682,75 @@
 
 instance Hashable InstanceGroupTimeline
 
+instance NFData InstanceGroupTimeline
+
+-- | Custom policy for requesting termination protection or termination of
+-- specific instances when shrinking an instance group.
+--
+-- /See:/ 'instanceResizePolicy' smart constructor.
+data InstanceResizePolicy = InstanceResizePolicy'
+    { _irpInstancesToProtect         :: !(Maybe [Text])
+    , _irpInstancesToTerminate       :: !(Maybe [Text])
+    , _irpInstanceTerminationTimeout :: !(Maybe Int)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'InstanceResizePolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'irpInstancesToProtect'
+--
+-- * 'irpInstancesToTerminate'
+--
+-- * 'irpInstanceTerminationTimeout'
+instanceResizePolicy
+    :: InstanceResizePolicy
+instanceResizePolicy =
+    InstanceResizePolicy'
+    { _irpInstancesToProtect = Nothing
+    , _irpInstancesToTerminate = Nothing
+    , _irpInstanceTerminationTimeout = Nothing
+    }
+
+-- | Specific list of instances to be protected when shrinking an instance
+-- group.
+irpInstancesToProtect :: Lens' InstanceResizePolicy [Text]
+irpInstancesToProtect = lens _irpInstancesToProtect (\ s a -> s{_irpInstancesToProtect = a}) . _Default . _Coerce;
+
+-- | Specific list of instances to be terminated when shrinking an instance
+-- group.
+irpInstancesToTerminate :: Lens' InstanceResizePolicy [Text]
+irpInstancesToTerminate = lens _irpInstancesToTerminate (\ s a -> s{_irpInstancesToTerminate = a}) . _Default . _Coerce;
+
+-- | Decommissioning timeout override for the specific list of instances to
+-- be terminated.
+irpInstanceTerminationTimeout :: Lens' InstanceResizePolicy (Maybe Int)
+irpInstanceTerminationTimeout = lens _irpInstanceTerminationTimeout (\ s a -> s{_irpInstanceTerminationTimeout = a});
+
+instance FromJSON InstanceResizePolicy where
+        parseJSON
+          = withObject "InstanceResizePolicy"
+              (\ x ->
+                 InstanceResizePolicy' <$>
+                   (x .:? "InstancesToProtect" .!= mempty) <*>
+                     (x .:? "InstancesToTerminate" .!= mempty)
+                     <*> (x .:? "InstanceTerminationTimeout"))
+
+instance Hashable InstanceResizePolicy
+
+instance NFData InstanceResizePolicy
+
+instance ToJSON InstanceResizePolicy where
+        toJSON InstanceResizePolicy'{..}
+          = object
+              (catMaybes
+                 [("InstancesToProtect" .=) <$>
+                    _irpInstancesToProtect,
+                  ("InstancesToTerminate" .=) <$>
+                    _irpInstancesToTerminate,
+                  ("InstanceTerminationTimeout" .=) <$>
+                    _irpInstanceTerminationTimeout])
+
 -- | The details of the status change reason for the instance.
 --
 -- /See:/ 'instanceStateChangeReason' smart constructor.
@@ -1661,6 +1791,8 @@
 
 instance Hashable InstanceStateChangeReason
 
+instance NFData InstanceStateChangeReason
+
 -- | The instance status details.
 --
 -- /See:/ 'instanceStatus' smart constructor.
@@ -1710,6 +1842,8 @@
 
 instance Hashable InstanceStatus
 
+instance NFData InstanceStatus
+
 -- | The timeline of the instance lifecycle.
 --
 -- /See:/ 'instanceTimeline' smart constructor.
@@ -1760,6 +1894,8 @@
 
 instance Hashable InstanceTimeline
 
+instance NFData InstanceTimeline
+
 -- | A description of the Amazon EC2 instance running the job flow. A valid
 -- JobFlowInstancesConfig must contain at least InstanceGroups, which is
 -- the recommended configuration. However, a valid alternative is to have
@@ -1919,6 +2055,8 @@
 
 instance Hashable JobFlowInstancesConfig
 
+instance NFData JobFlowInstancesConfig
+
 instance ToJSON JobFlowInstancesConfig where
         toJSON JobFlowInstancesConfig'{..}
           = object
@@ -1980,6 +2118,8 @@
 
 instance Hashable KeyValue
 
+instance NFData KeyValue
+
 instance ToJSON KeyValue where
         toJSON KeyValue'{..}
           = object
@@ -2012,6 +2152,8 @@
 
 instance Hashable PlacementType
 
+instance NFData PlacementType
+
 instance ToJSON PlacementType where
         toJSON PlacementType'{..}
           = object
@@ -2053,6 +2195,8 @@
 
 instance Hashable ScriptBootstrapActionConfig
 
+instance NFData ScriptBootstrapActionConfig
+
 instance ToJSON ScriptBootstrapActionConfig where
         toJSON ScriptBootstrapActionConfig'{..}
           = object
@@ -2060,6 +2204,61 @@
                  [("Args" .=) <$> _sbacArgs,
                   Just ("Path" .= _sbacPath)])
 
+-- | Policy for customizing shrink operations. Allows configuration of
+-- decommissioning timeout and targeted instance shrinking.
+--
+-- /See:/ 'shrinkPolicy' smart constructor.
+data ShrinkPolicy = ShrinkPolicy'
+    { _spDecommissionTimeout  :: !(Maybe Int)
+    , _spInstanceResizePolicy :: !(Maybe InstanceResizePolicy)
+    } deriving (Eq,Read,Show,Data,Typeable,Generic)
+
+-- | Creates a value of 'ShrinkPolicy' with the minimum fields required to make a request.
+--
+-- Use one of the following lenses to modify other fields as desired:
+--
+-- * 'spDecommissionTimeout'
+--
+-- * 'spInstanceResizePolicy'
+shrinkPolicy
+    :: ShrinkPolicy
+shrinkPolicy =
+    ShrinkPolicy'
+    { _spDecommissionTimeout = Nothing
+    , _spInstanceResizePolicy = Nothing
+    }
+
+-- | The desired timeout for decommissioning an instance. Overrides the
+-- default YARN decommissioning timeout.
+spDecommissionTimeout :: Lens' ShrinkPolicy (Maybe Int)
+spDecommissionTimeout = lens _spDecommissionTimeout (\ s a -> s{_spDecommissionTimeout = a});
+
+-- | Custom policy for requesting termination protection or termination of
+-- specific instances when shrinking an instance group.
+spInstanceResizePolicy :: Lens' ShrinkPolicy (Maybe InstanceResizePolicy)
+spInstanceResizePolicy = lens _spInstanceResizePolicy (\ s a -> s{_spInstanceResizePolicy = a});
+
+instance FromJSON ShrinkPolicy where
+        parseJSON
+          = withObject "ShrinkPolicy"
+              (\ x ->
+                 ShrinkPolicy' <$>
+                   (x .:? "DecommissionTimeout") <*>
+                     (x .:? "InstanceResizePolicy"))
+
+instance Hashable ShrinkPolicy
+
+instance NFData ShrinkPolicy
+
+instance ToJSON ShrinkPolicy where
+        toJSON ShrinkPolicy'{..}
+          = object
+              (catMaybes
+                 [("DecommissionTimeout" .=) <$>
+                    _spDecommissionTimeout,
+                  ("InstanceResizePolicy" .=) <$>
+                    _spInstanceResizePolicy])
+
 -- | This represents a step in a cluster.
 --
 -- /See:/ 'step' smart constructor.
@@ -2128,6 +2327,8 @@
 
 instance Hashable Step
 
+instance NFData Step
+
 -- | Specification of a job flow step.
 --
 -- /See:/ 'stepConfig' smart constructor.
@@ -2171,6 +2372,8 @@
 
 instance Hashable StepConfig
 
+instance NFData StepConfig
+
 instance ToJSON StepConfig where
         toJSON StepConfig'{..}
           = object
@@ -2220,6 +2423,8 @@
 
 instance Hashable StepStateChangeReason
 
+instance NFData StepStateChangeReason
+
 -- | The execution status details of the cluster step.
 --
 -- /See:/ 'stepStatus' smart constructor.
@@ -2269,6 +2474,8 @@
 
 instance Hashable StepStatus
 
+instance NFData StepStatus
+
 -- | The summary of the cluster step.
 --
 -- /See:/ 'stepSummary' smart constructor.
@@ -2337,6 +2544,8 @@
 
 instance Hashable StepSummary
 
+instance NFData StepSummary
+
 -- | The timeline of the cluster step lifecycle.
 --
 -- /See:/ 'stepTimeline' smart constructor.
@@ -2386,6 +2595,8 @@
 
 instance Hashable StepTimeline
 
+instance NFData StepTimeline
+
 -- | The list of supported product configurations which allow user-supplied
 -- arguments. EMR accepts these arguments and forwards them to the
 -- corresponding installation script as bootstrap action arguments.
@@ -2421,6 +2632,8 @@
 
 instance Hashable SupportedProductConfig
 
+instance NFData SupportedProductConfig
+
 instance ToJSON SupportedProductConfig where
         toJSON SupportedProductConfig'{..}
           = object
@@ -2473,6 +2686,8 @@
 
 instance Hashable Tag
 
+instance NFData Tag
+
 instance ToJSON Tag where
         toJSON Tag'{..}
           = object
@@ -2533,6 +2748,8 @@
                      (x .: "SizeInGB"))
 
 instance Hashable VolumeSpecification
+
+instance NFData VolumeSpecification
 
 instance ToJSON VolumeSpecification where
         toJSON VolumeSpecification'{..}
diff --git a/gen/Network/AWS/EMR/Types/Sum.hs b/gen/Network/AWS/EMR/Types/Sum.hs
--- a/gen/Network/AWS/EMR/Types/Sum.hs
+++ b/gen/Network/AWS/EMR/Types/Sum.hs
@@ -43,6 +43,7 @@
         TerminateJobFlow -> "TERMINATE_JOB_FLOW"
 
 instance Hashable     ActionOnFailure
+instance NFData       ActionOnFailure
 instance ToByteString ActionOnFailure
 instance ToQuery      ActionOnFailure
 instance ToHeader     ActionOnFailure
@@ -86,6 +87,7 @@
         CSWaiting -> "WAITING"
 
 instance Hashable     ClusterState
+instance NFData       ClusterState
 instance ToByteString ClusterState
 instance ToQuery      ClusterState
 instance ToHeader     ClusterState
@@ -129,6 +131,7 @@
         CSCRCValidationError -> "VALIDATION_ERROR"
 
 instance Hashable     ClusterStateChangeReasonCode
+instance NFData       ClusterStateChangeReasonCode
 instance ToByteString ClusterStateChangeReasonCode
 instance ToQuery      ClusterStateChangeReasonCode
 instance ToHeader     ClusterStateChangeReasonCode
@@ -178,6 +181,7 @@
         Terminating -> "TERMINATING"
 
 instance Hashable     InstanceGroupState
+instance NFData       InstanceGroupState
 instance ToByteString InstanceGroupState
 instance ToQuery      InstanceGroupState
 instance ToHeader     InstanceGroupState
@@ -209,6 +213,7 @@
         ValidationError -> "VALIDATION_ERROR"
 
 instance Hashable     InstanceGroupStateChangeReasonCode
+instance NFData       InstanceGroupStateChangeReasonCode
 instance ToByteString InstanceGroupStateChangeReasonCode
 instance ToQuery      InstanceGroupStateChangeReasonCode
 instance ToHeader     InstanceGroupStateChangeReasonCode
@@ -237,6 +242,7 @@
         Task -> "TASK"
 
 instance Hashable     InstanceGroupType
+instance NFData       InstanceGroupType
 instance ToByteString InstanceGroupType
 instance ToQuery      InstanceGroupType
 instance ToHeader     InstanceGroupType
@@ -268,6 +274,7 @@
         IRTTask -> "TASK"
 
 instance Hashable     InstanceRoleType
+instance NFData       InstanceRoleType
 instance ToByteString InstanceRoleType
 instance ToQuery      InstanceRoleType
 instance ToHeader     InstanceRoleType
@@ -302,6 +309,7 @@
         ISTerminated -> "TERMINATED"
 
 instance Hashable     InstanceState
+instance NFData       InstanceState
 instance ToByteString InstanceState
 instance ToQuery      InstanceState
 instance ToHeader     InstanceState
@@ -336,6 +344,7 @@
         ISCRCValidationError -> "VALIDATION_ERROR"
 
 instance Hashable     InstanceStateChangeReasonCode
+instance NFData       InstanceStateChangeReasonCode
 instance ToByteString InstanceStateChangeReasonCode
 instance ToQuery      InstanceStateChangeReasonCode
 instance ToHeader     InstanceStateChangeReasonCode
@@ -361,6 +370,7 @@
         Spot -> "SPOT"
 
 instance Hashable     MarketType
+instance NFData       MarketType
 instance ToByteString MarketType
 instance ToQuery      MarketType
 instance ToHeader     MarketType
@@ -401,6 +411,7 @@
         SSRunning -> "RUNNING"
 
 instance Hashable     StepState
+instance NFData       StepState
 instance ToByteString StepState
 instance ToQuery      StepState
 instance ToHeader     StepState
@@ -426,6 +437,7 @@
         None -> "NONE"
 
 instance Hashable     StepStateChangeReasonCode
+instance NFData       StepStateChangeReasonCode
 instance ToByteString StepStateChangeReasonCode
 instance ToQuery      StepStateChangeReasonCode
 instance ToHeader     StepStateChangeReasonCode
