diff --git a/amazonka-s3.cabal b/amazonka-s3.cabal
--- a/amazonka-s3.cabal
+++ b/amazonka-s3.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-s3
-version:               0.0.0
+version:               0.0.1
 synopsis:              Amazon Simple Storage Service SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
@@ -93,5 +93,5 @@
           Network.AWS.S3.Internal
 
     build-depends:
-          amazonka-core
-        , base          >= 4.7 && < 5
+          amazonka-core == 0.0.1.*
+        , base          >= 4.7     && < 5
diff --git a/gen/Network/AWS/S3/CompleteMultipartUpload.hs b/gen/Network/AWS/S3/CompleteMultipartUpload.hs
--- a/gen/Network/AWS/S3/CompleteMultipartUpload.hs
+++ b/gen/Network/AWS/S3/CompleteMultipartUpload.hs
@@ -105,9 +105,9 @@
     , _cmur1Key                  :: Maybe Text
     , _cmur1Location             :: Maybe Text
     , _cmur1SSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _cmur1ServerSideEncryption :: Maybe Text
+    , _cmur1ServerSideEncryption :: Maybe ServerSideEncryption
     , _cmur1VersionId            :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'CompleteMultipartUploadResponse' constructor.
 --
@@ -125,7 +125,7 @@
 --
 -- * 'cmur1SSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'cmur1ServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'cmur1ServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 -- * 'cmur1VersionId' @::@ 'Maybe' 'Text'
 --
@@ -166,7 +166,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-cmur1ServerSideEncryption :: Lens' CompleteMultipartUploadResponse (Maybe Text)
+cmur1ServerSideEncryption :: Lens' CompleteMultipartUploadResponse (Maybe ServerSideEncryption)
 cmur1ServerSideEncryption =
     lens _cmur1ServerSideEncryption
         (\s a -> s { _cmur1ServerSideEncryption = a })
diff --git a/gen/Network/AWS/S3/CopyObject.hs b/gen/Network/AWS/S3/CopyObject.hs
--- a/gen/Network/AWS/S3/CopyObject.hs
+++ b/gen/Network/AWS/S3/CopyObject.hs
@@ -81,7 +81,7 @@
 import qualified GHC.Exts
 
 data CopyObject = CopyObject
-    { _coACL                            :: Maybe Text
+    { _coACL                            :: Maybe ObjectCannedACL
     , _coBucket                         :: Text
     , _coCacheControl                   :: Maybe Text
     , _coContentDisposition             :: Maybe Text
@@ -104,12 +104,12 @@
     , _coGrantWriteACP                  :: Maybe Text
     , _coKey                            :: Text
     , _coMetadata                       :: Map (CI Text) Text
-    , _coMetadataDirective              :: Maybe Text
+    , _coMetadataDirective              :: Maybe MetadataDirective
     , _coSSECustomerAlgorithm           :: Maybe Text
     , _coSSECustomerKey                 :: Maybe (Sensitive Text)
     , _coSSECustomerKeyMD5              :: Maybe Text
-    , _coServerSideEncryption           :: Maybe Text
-    , _coStorageClass                   :: Maybe Text
+    , _coServerSideEncryption           :: Maybe ServerSideEncryption
+    , _coStorageClass                   :: Maybe StorageClass
     , _coWebsiteRedirectLocation        :: Maybe Text
     } deriving (Eq, Show)
 
@@ -117,7 +117,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'coACL' @::@ 'Maybe' 'Text'
+-- * 'coACL' @::@ 'Maybe' 'ObjectCannedACL'
 --
 -- * 'coBucket' @::@ 'Text'
 --
@@ -163,7 +163,7 @@
 --
 -- * 'coMetadata' @::@ 'HashMap' ('CI' 'Text') 'Text'
 --
--- * 'coMetadataDirective' @::@ 'Maybe' 'Text'
+-- * 'coMetadataDirective' @::@ 'Maybe' 'MetadataDirective'
 --
 -- * 'coSSECustomerAlgorithm' @::@ 'Maybe' 'Text'
 --
@@ -171,9 +171,9 @@
 --
 -- * 'coSSECustomerKeyMD5' @::@ 'Maybe' 'Text'
 --
--- * 'coServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'coServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
--- * 'coStorageClass' @::@ 'Maybe' 'Text'
+-- * 'coStorageClass' @::@ 'Maybe' 'StorageClass'
 --
 -- * 'coWebsiteRedirectLocation' @::@ 'Maybe' 'Text'
 --
@@ -215,7 +215,7 @@
     }
 
 -- | The canned ACL to apply to the object.
-coACL :: Lens' CopyObject (Maybe Text)
+coACL :: Lens' CopyObject (Maybe ObjectCannedACL)
 coACL = lens _coACL (\s a -> s { _coACL = a })
 
 coBucket :: Lens' CopyObject Text
@@ -337,7 +337,7 @@
 
 -- | Specifies whether the metadata is copied from the source object or
 -- replaced with metadata provided in the request.
-coMetadataDirective :: Lens' CopyObject (Maybe Text)
+coMetadataDirective :: Lens' CopyObject (Maybe MetadataDirective)
 coMetadataDirective =
     lens _coMetadataDirective (\s a -> s { _coMetadataDirective = a })
 
@@ -364,12 +364,12 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-coServerSideEncryption :: Lens' CopyObject (Maybe Text)
+coServerSideEncryption :: Lens' CopyObject (Maybe ServerSideEncryption)
 coServerSideEncryption =
     lens _coServerSideEncryption (\s a -> s { _coServerSideEncryption = a })
 
 -- | The type of storage to use for the object. Defaults to 'STANDARD'.
-coStorageClass :: Lens' CopyObject (Maybe Text)
+coStorageClass :: Lens' CopyObject (Maybe StorageClass)
 coStorageClass = lens _coStorageClass (\s a -> s { _coStorageClass = a })
 
 -- | If the bucket is configured as a website, redirects requests for this
@@ -387,7 +387,7 @@
     , _corSSECustomerAlgorithm :: Maybe Text
     , _corSSECustomerKeyMD5    :: Maybe Text
     , _corSSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _corServerSideEncryption :: Maybe Text
+    , _corServerSideEncryption :: Maybe ServerSideEncryption
     } deriving (Eq, Show)
 
 -- | 'CopyObjectResponse' constructor.
@@ -406,7 +406,7 @@
 --
 -- * 'corSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'corServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'corServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 copyObjectResponse :: CopyObjectResponse
 copyObjectResponse = CopyObjectResponse
@@ -452,7 +452,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-corServerSideEncryption :: Lens' CopyObjectResponse (Maybe Text)
+corServerSideEncryption :: Lens' CopyObjectResponse (Maybe ServerSideEncryption)
 corServerSideEncryption =
     lens _corServerSideEncryption (\s a -> s { _corServerSideEncryption = a })
 
diff --git a/gen/Network/AWS/S3/CreateBucket.hs b/gen/Network/AWS/S3/CreateBucket.hs
--- a/gen/Network/AWS/S3/CreateBucket.hs
+++ b/gen/Network/AWS/S3/CreateBucket.hs
@@ -53,7 +53,7 @@
 import qualified GHC.Exts
 
 data CreateBucket = CreateBucket
-    { _cbACL                       :: Maybe Text
+    { _cbACL                       :: Maybe BucketCannedACL
     , _cbBucket                    :: Text
     , _cbCreateBucketConfiguration :: Maybe CreateBucketConfiguration
     , _cbGrantFullControl          :: Maybe Text
@@ -67,7 +67,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'cbACL' @::@ 'Maybe' 'Text'
+-- * 'cbACL' @::@ 'Maybe' 'BucketCannedACL'
 --
 -- * 'cbBucket' @::@ 'Text'
 --
@@ -97,7 +97,7 @@
     }
 
 -- | The canned ACL to apply to the bucket.
-cbACL :: Lens' CreateBucket (Maybe Text)
+cbACL :: Lens' CreateBucket (Maybe BucketCannedACL)
 cbACL = lens _cbACL (\s a -> s { _cbACL = a })
 
 cbBucket :: Lens' CreateBucket Text
diff --git a/gen/Network/AWS/S3/CreateMultipartUpload.hs b/gen/Network/AWS/S3/CreateMultipartUpload.hs
--- a/gen/Network/AWS/S3/CreateMultipartUpload.hs
+++ b/gen/Network/AWS/S3/CreateMultipartUpload.hs
@@ -77,7 +77,7 @@
 import qualified GHC.Exts
 
 data CreateMultipartUpload = CreateMultipartUpload
-    { _cmuACL                     :: Maybe Text
+    { _cmuACL                     :: Maybe ObjectCannedACL
     , _cmuBucket                  :: Text
     , _cmuCacheControl            :: Maybe Text
     , _cmuContentDisposition      :: Maybe Text
@@ -95,8 +95,8 @@
     , _cmuSSECustomerKey          :: Maybe (Sensitive Text)
     , _cmuSSECustomerKeyMD5       :: Maybe Text
     , _cmuSSEKMSKeyId             :: Maybe (Sensitive Text)
-    , _cmuServerSideEncryption    :: Maybe Text
-    , _cmuStorageClass            :: Maybe Text
+    , _cmuServerSideEncryption    :: Maybe ServerSideEncryption
+    , _cmuStorageClass            :: Maybe StorageClass
     , _cmuWebsiteRedirectLocation :: Maybe Text
     } deriving (Eq, Show)
 
@@ -104,7 +104,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'cmuACL' @::@ 'Maybe' 'Text'
+-- * 'cmuACL' @::@ 'Maybe' 'ObjectCannedACL'
 --
 -- * 'cmuBucket' @::@ 'Text'
 --
@@ -140,9 +140,9 @@
 --
 -- * 'cmuSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'cmuServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'cmuServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
--- * 'cmuStorageClass' @::@ 'Maybe' 'Text'
+-- * 'cmuStorageClass' @::@ 'Maybe' 'StorageClass'
 --
 -- * 'cmuWebsiteRedirectLocation' @::@ 'Maybe' 'Text'
 --
@@ -174,7 +174,7 @@
     }
 
 -- | The canned ACL to apply to the object.
-cmuACL :: Lens' CreateMultipartUpload (Maybe Text)
+cmuACL :: Lens' CreateMultipartUpload (Maybe ObjectCannedACL)
 cmuACL = lens _cmuACL (\s a -> s { _cmuACL = a })
 
 cmuBucket :: Lens' CreateMultipartUpload Text
@@ -263,12 +263,12 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-cmuServerSideEncryption :: Lens' CreateMultipartUpload (Maybe Text)
+cmuServerSideEncryption :: Lens' CreateMultipartUpload (Maybe ServerSideEncryption)
 cmuServerSideEncryption =
     lens _cmuServerSideEncryption (\s a -> s { _cmuServerSideEncryption = a })
 
 -- | The type of storage to use for the object. Defaults to 'STANDARD'.
-cmuStorageClass :: Lens' CreateMultipartUpload (Maybe Text)
+cmuStorageClass :: Lens' CreateMultipartUpload (Maybe StorageClass)
 cmuStorageClass = lens _cmuStorageClass (\s a -> s { _cmuStorageClass = a })
 
 -- | If the bucket is configured as a website, redirects requests for this
@@ -285,9 +285,9 @@
     , _cmurSSECustomerAlgorithm :: Maybe Text
     , _cmurSSECustomerKeyMD5    :: Maybe Text
     , _cmurSSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _cmurServerSideEncryption :: Maybe Text
+    , _cmurServerSideEncryption :: Maybe ServerSideEncryption
     , _cmurUploadId             :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'CreateMultipartUploadResponse' constructor.
 --
@@ -303,7 +303,7 @@
 --
 -- * 'cmurSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'cmurServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'cmurServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 -- * 'cmurUploadId' @::@ 'Maybe' 'Text'
 --
@@ -347,7 +347,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-cmurServerSideEncryption :: Lens' CreateMultipartUploadResponse (Maybe Text)
+cmurServerSideEncryption :: Lens' CreateMultipartUploadResponse (Maybe ServerSideEncryption)
 cmurServerSideEncryption =
     lens _cmurServerSideEncryption
         (\s a -> s { _cmurServerSideEncryption = a })
diff --git a/gen/Network/AWS/S3/DeleteObjects.hs b/gen/Network/AWS/S3/DeleteObjects.hs
--- a/gen/Network/AWS/S3/DeleteObjects.hs
+++ b/gen/Network/AWS/S3/DeleteObjects.hs
@@ -98,12 +98,10 @@
 --
 -- * 'dorErrors' @::@ ['S3ServiceError']
 --
-deleteObjectsResponse :: [DeletedObject] -- ^ 'dorDeleted'
-                      -> [S3ServiceError] -- ^ 'dorErrors'
-                      -> DeleteObjectsResponse
-deleteObjectsResponse p1 p2 = DeleteObjectsResponse
-    { _dorDeleted = withIso _List (const id) p1
-    , _dorErrors  = withIso _List (const id) p2
+deleteObjectsResponse :: DeleteObjectsResponse
+deleteObjectsResponse = DeleteObjectsResponse
+    { _dorDeleted = mempty
+    , _dorErrors  = mempty
     }
 
 dorDeleted :: Lens' DeleteObjectsResponse [DeletedObject]
diff --git a/gen/Network/AWS/S3/GetBucketCors.hs b/gen/Network/AWS/S3/GetBucketCors.hs
--- a/gen/Network/AWS/S3/GetBucketCors.hs
+++ b/gen/Network/AWS/S3/GetBucketCors.hs
@@ -74,10 +74,9 @@
 --
 -- * 'gbcrCORSRules' @::@ ['CORSRule']
 --
-getBucketCorsResponse :: [CORSRule] -- ^ 'gbcrCORSRules'
-                      -> GetBucketCorsResponse
-getBucketCorsResponse p1 = GetBucketCorsResponse
-    { _gbcrCORSRules = withIso _List (const id) p1
+getBucketCorsResponse :: GetBucketCorsResponse
+getBucketCorsResponse = GetBucketCorsResponse
+    { _gbcrCORSRules = mempty
     }
 
 gbcrCORSRules :: Lens' GetBucketCorsResponse [CORSRule]
diff --git a/gen/Network/AWS/S3/GetBucketLifecycle.hs b/gen/Network/AWS/S3/GetBucketLifecycle.hs
--- a/gen/Network/AWS/S3/GetBucketLifecycle.hs
+++ b/gen/Network/AWS/S3/GetBucketLifecycle.hs
@@ -74,10 +74,9 @@
 --
 -- * 'gblrRules' @::@ ['Rule']
 --
-getBucketLifecycleResponse :: [Rule] -- ^ 'gblrRules'
-                           -> GetBucketLifecycleResponse
-getBucketLifecycleResponse p1 = GetBucketLifecycleResponse
-    { _gblrRules = withIso _List (const id) p1
+getBucketLifecycleResponse :: GetBucketLifecycleResponse
+getBucketLifecycleResponse = GetBucketLifecycleResponse
+    { _gblrRules = mempty
     }
 
 gblrRules :: Lens' GetBucketLifecycleResponse [Rule]
diff --git a/gen/Network/AWS/S3/GetBucketLocation.hs b/gen/Network/AWS/S3/GetBucketLocation.hs
--- a/gen/Network/AWS/S3/GetBucketLocation.hs
+++ b/gen/Network/AWS/S3/GetBucketLocation.hs
@@ -65,21 +65,21 @@
 gblBucket = lens _gblBucket (\s a -> s { _gblBucket = a })
 
 newtype GetBucketLocationResponse = GetBucketLocationResponse
-    { _gblrLocationConstraint :: Maybe Text
-    } deriving (Eq, Ord, Show, Monoid)
+    { _gblrLocationConstraint :: Maybe Region
+    } deriving (Eq, Show)
 
 -- | 'GetBucketLocationResponse' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'gblrLocationConstraint' @::@ 'Maybe' 'Text'
+-- * 'gblrLocationConstraint' @::@ 'Maybe' 'Region'
 --
 getBucketLocationResponse :: GetBucketLocationResponse
 getBucketLocationResponse = GetBucketLocationResponse
     { _gblrLocationConstraint = Nothing
     }
 
-gblrLocationConstraint :: Lens' GetBucketLocationResponse (Maybe Text)
+gblrLocationConstraint :: Lens' GetBucketLocationResponse (Maybe Region)
 gblrLocationConstraint =
     lens _gblrLocationConstraint (\s a -> s { _gblrLocationConstraint = a })
 
diff --git a/gen/Network/AWS/S3/GetBucketRequestPayment.hs b/gen/Network/AWS/S3/GetBucketRequestPayment.hs
--- a/gen/Network/AWS/S3/GetBucketRequestPayment.hs
+++ b/gen/Network/AWS/S3/GetBucketRequestPayment.hs
@@ -65,14 +65,14 @@
 gbrpBucket = lens _gbrpBucket (\s a -> s { _gbrpBucket = a })
 
 newtype GetBucketRequestPaymentResponse = GetBucketRequestPaymentResponse
-    { _gbrprPayer :: Maybe Text
-    } deriving (Eq, Ord, Show, Monoid)
+    { _gbrprPayer :: Maybe Payer
+    } deriving (Eq, Show)
 
 -- | 'GetBucketRequestPaymentResponse' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'gbrprPayer' @::@ 'Maybe' 'Text'
+-- * 'gbrprPayer' @::@ 'Maybe' 'Payer'
 --
 getBucketRequestPaymentResponse :: GetBucketRequestPaymentResponse
 getBucketRequestPaymentResponse = GetBucketRequestPaymentResponse
@@ -80,7 +80,7 @@
     }
 
 -- | Specifies who pays for the download and request fees.
-gbrprPayer :: Lens' GetBucketRequestPaymentResponse (Maybe Text)
+gbrprPayer :: Lens' GetBucketRequestPaymentResponse (Maybe Payer)
 gbrprPayer = lens _gbrprPayer (\s a -> s { _gbrprPayer = a })
 
 instance ToPath GetBucketRequestPayment where
diff --git a/gen/Network/AWS/S3/GetBucketVersioning.hs b/gen/Network/AWS/S3/GetBucketVersioning.hs
--- a/gen/Network/AWS/S3/GetBucketVersioning.hs
+++ b/gen/Network/AWS/S3/GetBucketVersioning.hs
@@ -66,17 +66,17 @@
 gbvBucket = lens _gbvBucket (\s a -> s { _gbvBucket = a })
 
 data GetBucketVersioningResponse = GetBucketVersioningResponse
-    { _gbvrMFADelete :: Maybe Text
-    , _gbvrStatus    :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    { _gbvrMFADelete :: Maybe MFADeleteStatus
+    , _gbvrStatus    :: Maybe BucketVersioningStatus
+    } deriving (Eq, Show)
 
 -- | 'GetBucketVersioningResponse' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'gbvrMFADelete' @::@ 'Maybe' 'Text'
+-- * 'gbvrMFADelete' @::@ 'Maybe' 'MFADeleteStatus'
 --
--- * 'gbvrStatus' @::@ 'Maybe' 'Text'
+-- * 'gbvrStatus' @::@ 'Maybe' 'BucketVersioningStatus'
 --
 getBucketVersioningResponse :: GetBucketVersioningResponse
 getBucketVersioningResponse = GetBucketVersioningResponse
@@ -88,11 +88,11 @@
 -- configuration. This element is only returned if the bucket has been
 -- configured with MFA delete. If the bucket has never been so configured,
 -- this element is not returned.
-gbvrMFADelete :: Lens' GetBucketVersioningResponse (Maybe Text)
+gbvrMFADelete :: Lens' GetBucketVersioningResponse (Maybe MFADeleteStatus)
 gbvrMFADelete = lens _gbvrMFADelete (\s a -> s { _gbvrMFADelete = a })
 
 -- | The versioning state of the bucket.
-gbvrStatus :: Lens' GetBucketVersioningResponse (Maybe Text)
+gbvrStatus :: Lens' GetBucketVersioningResponse (Maybe BucketVersioningStatus)
 gbvrStatus = lens _gbvrStatus (\s a -> s { _gbvrStatus = a })
 
 instance ToPath GetBucketVersioning where
diff --git a/gen/Network/AWS/S3/GetObject.hs b/gen/Network/AWS/S3/GetObject.hs
--- a/gen/Network/AWS/S3/GetObject.hs
+++ b/gen/Network/AWS/S3/GetObject.hs
@@ -287,7 +287,7 @@
     , _gorSSECustomerAlgorithm    :: Maybe Text
     , _gorSSECustomerKeyMD5       :: Maybe Text
     , _gorSSEKMSKeyId             :: Maybe (Sensitive Text)
-    , _gorServerSideEncryption    :: Maybe Text
+    , _gorServerSideEncryption    :: Maybe ServerSideEncryption
     , _gorVersionId               :: Maybe Text
     , _gorWebsiteRedirectLocation :: Maybe Text
     } deriving (Show)
@@ -334,7 +334,7 @@
 --
 -- * 'gorSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'gorServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'gorServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 -- * 'gorVersionId' @::@ 'Maybe' 'Text'
 --
@@ -466,7 +466,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-gorServerSideEncryption :: Lens' GetObjectResponse (Maybe Text)
+gorServerSideEncryption :: Lens' GetObjectResponse (Maybe ServerSideEncryption)
 gorServerSideEncryption =
     lens _gorServerSideEncryption (\s a -> s { _gorServerSideEncryption = a })
 
diff --git a/gen/Network/AWS/S3/HeadObject.hs b/gen/Network/AWS/S3/HeadObject.hs
--- a/gen/Network/AWS/S3/HeadObject.hs
+++ b/gen/Network/AWS/S3/HeadObject.hs
@@ -223,7 +223,7 @@
     , _horSSECustomerAlgorithm    :: Maybe Text
     , _horSSECustomerKeyMD5       :: Maybe Text
     , _horSSEKMSKeyId             :: Maybe (Sensitive Text)
-    , _horServerSideEncryption    :: Maybe Text
+    , _horServerSideEncryption    :: Maybe ServerSideEncryption
     , _horVersionId               :: Maybe Text
     , _horWebsiteRedirectLocation :: Maybe Text
     } deriving (Eq, Show)
@@ -268,7 +268,7 @@
 --
 -- * 'horSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'horServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'horServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 -- * 'horVersionId' @::@ 'Maybe' 'Text'
 --
@@ -394,7 +394,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-horServerSideEncryption :: Lens' HeadObjectResponse (Maybe Text)
+horServerSideEncryption :: Lens' HeadObjectResponse (Maybe ServerSideEncryption)
 horServerSideEncryption =
     lens _horServerSideEncryption (\s a -> s { _horServerSideEncryption = a })
 
diff --git a/gen/Network/AWS/S3/ListMultipartUploads.hs b/gen/Network/AWS/S3/ListMultipartUploads.hs
--- a/gen/Network/AWS/S3/ListMultipartUploads.hs
+++ b/gen/Network/AWS/S3/ListMultipartUploads.hs
@@ -65,12 +65,12 @@
 data ListMultipartUploads = ListMultipartUploads
     { _lmuBucket         :: Text
     , _lmuDelimiter      :: Maybe Text
-    , _lmuEncodingType   :: Maybe Text
+    , _lmuEncodingType   :: Maybe EncodingType
     , _lmuKeyMarker      :: Maybe Text
     , _lmuMaxUploads     :: Maybe Int
     , _lmuPrefix         :: Maybe Text
     , _lmuUploadIdMarker :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'ListMultipartUploads' constructor.
 --
@@ -80,7 +80,7 @@
 --
 -- * 'lmuDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'lmuEncodingType' @::@ 'Maybe' 'Text'
+-- * 'lmuEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'lmuKeyMarker' @::@ 'Maybe' 'Text'
 --
@@ -109,7 +109,7 @@
 lmuDelimiter :: Lens' ListMultipartUploads (Maybe Text)
 lmuDelimiter = lens _lmuDelimiter (\s a -> s { _lmuDelimiter = a })
 
-lmuEncodingType :: Lens' ListMultipartUploads (Maybe Text)
+lmuEncodingType :: Lens' ListMultipartUploads (Maybe EncodingType)
 lmuEncodingType = lens _lmuEncodingType (\s a -> s { _lmuEncodingType = a })
 
 -- | Together with upload-id-marker, this parameter specifies the multipart
@@ -139,7 +139,7 @@
     { _lmurBucket             :: Maybe Text
     , _lmurCommonPrefixes     :: List "CommonPrefixes" CommonPrefix
     , _lmurDelimiter          :: Maybe Text
-    , _lmurEncodingType       :: Maybe Text
+    , _lmurEncodingType       :: Maybe EncodingType
     , _lmurIsTruncated        :: Maybe Bool
     , _lmurKeyMarker          :: Maybe Text
     , _lmurMaxUploads         :: Maybe Int
@@ -160,7 +160,7 @@
 --
 -- * 'lmurDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'lmurEncodingType' @::@ 'Maybe' 'Text'
+-- * 'lmurEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'lmurIsTruncated' @::@ 'Maybe' 'Bool'
 --
@@ -178,13 +178,9 @@
 --
 -- * 'lmurUploads' @::@ ['MultipartUpload']
 --
-listMultipartUploadsResponse :: [MultipartUpload] -- ^ 'lmurUploads'
-                             -> [CommonPrefix] -- ^ 'lmurCommonPrefixes'
-                             -> ListMultipartUploadsResponse
-listMultipartUploadsResponse p1 p2 = ListMultipartUploadsResponse
-    { _lmurUploads            = withIso _List (const id) p1
-    , _lmurCommonPrefixes     = withIso _List (const id) p2
-    , _lmurBucket             = Nothing
+listMultipartUploadsResponse :: ListMultipartUploadsResponse
+listMultipartUploadsResponse = ListMultipartUploadsResponse
+    { _lmurBucket             = Nothing
     , _lmurKeyMarker          = Nothing
     , _lmurUploadIdMarker     = Nothing
     , _lmurNextKeyMarker      = Nothing
@@ -193,6 +189,8 @@
     , _lmurNextUploadIdMarker = Nothing
     , _lmurMaxUploads         = Nothing
     , _lmurIsTruncated        = Nothing
+    , _lmurUploads            = mempty
+    , _lmurCommonPrefixes     = mempty
     , _lmurEncodingType       = Nothing
     }
 
@@ -209,7 +207,7 @@
 lmurDelimiter = lens _lmurDelimiter (\s a -> s { _lmurDelimiter = a })
 
 -- | Encoding type used by Amazon S3 to encode object keys in the response.
-lmurEncodingType :: Lens' ListMultipartUploadsResponse (Maybe Text)
+lmurEncodingType :: Lens' ListMultipartUploadsResponse (Maybe EncodingType)
 lmurEncodingType = lens _lmurEncodingType (\s a -> s { _lmurEncodingType = a })
 
 -- | Indicates whether the returned list of multipart uploads is truncated. A
diff --git a/gen/Network/AWS/S3/ListObjectVersions.hs b/gen/Network/AWS/S3/ListObjectVersions.hs
--- a/gen/Network/AWS/S3/ListObjectVersions.hs
+++ b/gen/Network/AWS/S3/ListObjectVersions.hs
@@ -66,12 +66,12 @@
 data ListObjectVersions = ListObjectVersions
     { _lovBucket          :: Text
     , _lovDelimiter       :: Maybe Text
-    , _lovEncodingType    :: Maybe Text
+    , _lovEncodingType    :: Maybe EncodingType
     , _lovKeyMarker       :: Maybe Text
     , _lovMaxKeys         :: Maybe Int
     , _lovPrefix          :: Maybe Text
     , _lovVersionIdMarker :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'ListObjectVersions' constructor.
 --
@@ -81,7 +81,7 @@
 --
 -- * 'lovDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'lovEncodingType' @::@ 'Maybe' 'Text'
+-- * 'lovEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'lovKeyMarker' @::@ 'Maybe' 'Text'
 --
@@ -110,7 +110,7 @@
 lovDelimiter :: Lens' ListObjectVersions (Maybe Text)
 lovDelimiter = lens _lovDelimiter (\s a -> s { _lovDelimiter = a })
 
-lovEncodingType :: Lens' ListObjectVersions (Maybe Text)
+lovEncodingType :: Lens' ListObjectVersions (Maybe EncodingType)
 lovEncodingType = lens _lovEncodingType (\s a -> s { _lovEncodingType = a })
 
 -- | Specifies the key to start with when listing objects in a bucket.
@@ -135,7 +135,7 @@
     { _lovrCommonPrefixes      :: List "CommonPrefixes" CommonPrefix
     , _lovrDeleteMarkers       :: List "DeleteMarker" DeleteMarkerEntry
     , _lovrDelimiter           :: Maybe Text
-    , _lovrEncodingType        :: Maybe Text
+    , _lovrEncodingType        :: Maybe EncodingType
     , _lovrIsTruncated         :: Maybe Bool
     , _lovrKeyMarker           :: Maybe Text
     , _lovrMaxKeys             :: Maybe Int
@@ -157,7 +157,7 @@
 --
 -- * 'lovrDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'lovrEncodingType' @::@ 'Maybe' 'Text'
+-- * 'lovrEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'lovrIsTruncated' @::@ 'Maybe' 'Bool'
 --
@@ -177,23 +177,20 @@
 --
 -- * 'lovrVersions' @::@ ['ObjectVersion']
 --
-listObjectVersionsResponse :: [ObjectVersion] -- ^ 'lovrVersions'
-                           -> [DeleteMarkerEntry] -- ^ 'lovrDeleteMarkers'
-                           -> [CommonPrefix] -- ^ 'lovrCommonPrefixes'
-                           -> ListObjectVersionsResponse
-listObjectVersionsResponse p1 p2 p3 = ListObjectVersionsResponse
-    { _lovrVersions            = withIso _List (const id) p1
-    , _lovrDeleteMarkers       = withIso _List (const id) p2
-    , _lovrCommonPrefixes      = withIso _List (const id) p3
-    , _lovrIsTruncated         = Nothing
+listObjectVersionsResponse :: ListObjectVersionsResponse
+listObjectVersionsResponse = ListObjectVersionsResponse
+    { _lovrIsTruncated         = Nothing
     , _lovrKeyMarker           = Nothing
     , _lovrVersionIdMarker     = Nothing
     , _lovrNextKeyMarker       = Nothing
     , _lovrNextVersionIdMarker = Nothing
+    , _lovrVersions            = mempty
+    , _lovrDeleteMarkers       = mempty
     , _lovrName                = Nothing
     , _lovrPrefix              = Nothing
     , _lovrDelimiter           = Nothing
     , _lovrMaxKeys             = Nothing
+    , _lovrCommonPrefixes      = mempty
     , _lovrEncodingType        = Nothing
     }
 
@@ -211,7 +208,7 @@
 lovrDelimiter = lens _lovrDelimiter (\s a -> s { _lovrDelimiter = a })
 
 -- | Encoding type used by Amazon S3 to encode object keys in the response.
-lovrEncodingType :: Lens' ListObjectVersionsResponse (Maybe Text)
+lovrEncodingType :: Lens' ListObjectVersionsResponse (Maybe EncodingType)
 lovrEncodingType = lens _lovrEncodingType (\s a -> s { _lovrEncodingType = a })
 
 -- | A flag that indicates whether or not Amazon S3 returned all of the
diff --git a/gen/Network/AWS/S3/ListObjects.hs b/gen/Network/AWS/S3/ListObjects.hs
--- a/gen/Network/AWS/S3/ListObjects.hs
+++ b/gen/Network/AWS/S3/ListObjects.hs
@@ -64,11 +64,11 @@
 data ListObjects = ListObjects
     { _loBucket       :: Text
     , _loDelimiter    :: Maybe Text
-    , _loEncodingType :: Maybe Text
+    , _loEncodingType :: Maybe EncodingType
     , _loMarker       :: Maybe Text
     , _loMaxKeys      :: Maybe Int
     , _loPrefix       :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'ListObjects' constructor.
 --
@@ -78,7 +78,7 @@
 --
 -- * 'loDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'loEncodingType' @::@ 'Maybe' 'Text'
+-- * 'loEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'loMarker' @::@ 'Maybe' 'Text'
 --
@@ -104,7 +104,7 @@
 loDelimiter :: Lens' ListObjects (Maybe Text)
 loDelimiter = lens _loDelimiter (\s a -> s { _loDelimiter = a })
 
-loEncodingType :: Lens' ListObjects (Maybe Text)
+loEncodingType :: Lens' ListObjects (Maybe EncodingType)
 loEncodingType = lens _loEncodingType (\s a -> s { _loEncodingType = a })
 
 -- | Specifies the key to start with when listing objects in a bucket.
@@ -124,7 +124,7 @@
     { _lorCommonPrefixes :: List "CommonPrefixes" CommonPrefix
     , _lorContents       :: List "Contents" Object
     , _lorDelimiter      :: Maybe Text
-    , _lorEncodingType   :: Maybe Text
+    , _lorEncodingType   :: Maybe EncodingType
     , _lorIsTruncated    :: Maybe Bool
     , _lorMarker         :: Maybe Text
     , _lorMaxKeys        :: Maybe Int
@@ -143,7 +143,7 @@
 --
 -- * 'lorDelimiter' @::@ 'Maybe' 'Text'
 --
--- * 'lorEncodingType' @::@ 'Maybe' 'Text'
+-- * 'lorEncodingType' @::@ 'Maybe' 'EncodingType'
 --
 -- * 'lorIsTruncated' @::@ 'Maybe' 'Bool'
 --
@@ -157,19 +157,17 @@
 --
 -- * 'lorPrefix' @::@ 'Maybe' 'Text'
 --
-listObjectsResponse :: [Object] -- ^ 'lorContents'
-                    -> [CommonPrefix] -- ^ 'lorCommonPrefixes'
-                    -> ListObjectsResponse
-listObjectsResponse p1 p2 = ListObjectsResponse
-    { _lorContents       = withIso _List (const id) p1
-    , _lorCommonPrefixes = withIso _List (const id) p2
-    , _lorIsTruncated    = Nothing
+listObjectsResponse :: ListObjectsResponse
+listObjectsResponse = ListObjectsResponse
+    { _lorIsTruncated    = Nothing
     , _lorMarker         = Nothing
     , _lorNextMarker     = Nothing
+    , _lorContents       = mempty
     , _lorName           = Nothing
     , _lorPrefix         = Nothing
     , _lorDelimiter      = Nothing
     , _lorMaxKeys        = Nothing
+    , _lorCommonPrefixes = mempty
     , _lorEncodingType   = Nothing
     }
 
@@ -185,7 +183,7 @@
 lorDelimiter = lens _lorDelimiter (\s a -> s { _lorDelimiter = a })
 
 -- | Encoding type used by Amazon S3 to encode object keys in the response.
-lorEncodingType :: Lens' ListObjectsResponse (Maybe Text)
+lorEncodingType :: Lens' ListObjectsResponse (Maybe EncodingType)
 lorEncodingType = lens _lorEncodingType (\s a -> s { _lorEncodingType = a })
 
 -- | A flag that indicates whether or not Amazon S3 returned all of the
diff --git a/gen/Network/AWS/S3/ListParts.hs b/gen/Network/AWS/S3/ListParts.hs
--- a/gen/Network/AWS/S3/ListParts.hs
+++ b/gen/Network/AWS/S3/ListParts.hs
@@ -123,7 +123,7 @@
     , _lprOwner                :: Maybe Owner
     , _lprPartNumberMarker     :: Maybe Int
     , _lprParts                :: List "Part" Part
-    , _lprStorageClass         :: Maybe Text
+    , _lprStorageClass         :: Maybe StorageClass
     , _lprUploadId             :: Maybe Text
     } deriving (Eq, Show)
 
@@ -149,21 +149,20 @@
 --
 -- * 'lprParts' @::@ ['Part']
 --
--- * 'lprStorageClass' @::@ 'Maybe' 'Text'
+-- * 'lprStorageClass' @::@ 'Maybe' 'StorageClass'
 --
 -- * 'lprUploadId' @::@ 'Maybe' 'Text'
 --
-listPartsResponse :: [Part] -- ^ 'lprParts'
-                  -> ListPartsResponse
-listPartsResponse p1 = ListPartsResponse
-    { _lprParts                = withIso _List (const id) p1
-    , _lprBucket               = Nothing
+listPartsResponse :: ListPartsResponse
+listPartsResponse = ListPartsResponse
+    { _lprBucket               = Nothing
     , _lprKey                  = Nothing
     , _lprUploadId             = Nothing
     , _lprPartNumberMarker     = Nothing
     , _lprNextPartNumberMarker = Nothing
     , _lprMaxParts             = Nothing
     , _lprIsTruncated          = Nothing
+    , _lprParts                = mempty
     , _lprInitiator            = Nothing
     , _lprOwner                = Nothing
     , _lprStorageClass         = Nothing
@@ -208,7 +207,7 @@
 lprParts = lens _lprParts (\s a -> s { _lprParts = a }) . _List
 
 -- | The class of storage used to store the object.
-lprStorageClass :: Lens' ListPartsResponse (Maybe Text)
+lprStorageClass :: Lens' ListPartsResponse (Maybe StorageClass)
 lprStorageClass = lens _lprStorageClass (\s a -> s { _lprStorageClass = a })
 
 -- | Upload ID identifying the multipart upload whose parts are being listed.
diff --git a/gen/Network/AWS/S3/PutBucketAcl.hs b/gen/Network/AWS/S3/PutBucketAcl.hs
--- a/gen/Network/AWS/S3/PutBucketAcl.hs
+++ b/gen/Network/AWS/S3/PutBucketAcl.hs
@@ -52,7 +52,7 @@
 import qualified GHC.Exts
 
 data PutBucketAcl = PutBucketAcl
-    { _pbaACL                 :: Maybe Text
+    { _pbaACL                 :: Maybe BucketCannedACL
     , _pbaAccessControlPolicy :: Maybe AccessControlPolicy
     , _pbaBucket              :: Text
     , _pbaContentMD5          :: Maybe Text
@@ -67,7 +67,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'pbaACL' @::@ 'Maybe' 'Text'
+-- * 'pbaACL' @::@ 'Maybe' 'BucketCannedACL'
 --
 -- * 'pbaAccessControlPolicy' @::@ 'Maybe' 'AccessControlPolicy'
 --
@@ -100,7 +100,7 @@
     }
 
 -- | The canned ACL to apply to the bucket.
-pbaACL :: Lens' PutBucketAcl (Maybe Text)
+pbaACL :: Lens' PutBucketAcl (Maybe BucketCannedACL)
 pbaACL = lens _pbaACL (\s a -> s { _pbaACL = a })
 
 pbaAccessControlPolicy :: Lens' PutBucketAcl (Maybe AccessControlPolicy)
diff --git a/gen/Network/AWS/S3/PutObject.hs b/gen/Network/AWS/S3/PutObject.hs
--- a/gen/Network/AWS/S3/PutObject.hs
+++ b/gen/Network/AWS/S3/PutObject.hs
@@ -75,7 +75,7 @@
 import qualified GHC.Exts
 
 data PutObject = PutObject
-    { _poACL                     :: Maybe Text
+    { _poACL                     :: Maybe ObjectCannedACL
     , _poBody                    :: RqBody
     , _poBucket                  :: Text
     , _poCacheControl            :: Maybe Text
@@ -96,8 +96,8 @@
     , _poSSECustomerKey          :: Maybe (Sensitive Text)
     , _poSSECustomerKeyMD5       :: Maybe Text
     , _poSSEKMSKeyId             :: Maybe (Sensitive Text)
-    , _poServerSideEncryption    :: Maybe Text
-    , _poStorageClass            :: Maybe Text
+    , _poServerSideEncryption    :: Maybe ServerSideEncryption
+    , _poStorageClass            :: Maybe StorageClass
     , _poWebsiteRedirectLocation :: Maybe Text
     } deriving (Show)
 
@@ -105,7 +105,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'poACL' @::@ 'Maybe' 'Text'
+-- * 'poACL' @::@ 'Maybe' 'ObjectCannedACL'
 --
 -- * 'poBody' @::@ 'RqBody'
 --
@@ -147,9 +147,9 @@
 --
 -- * 'poSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'poServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'poServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
--- * 'poStorageClass' @::@ 'Maybe' 'Text'
+-- * 'poStorageClass' @::@ 'Maybe' 'StorageClass'
 --
 -- * 'poWebsiteRedirectLocation' @::@ 'Maybe' 'Text'
 --
@@ -185,7 +185,7 @@
     }
 
 -- | The canned ACL to apply to the object.
-poACL :: Lens' PutObject (Maybe Text)
+poACL :: Lens' PutObject (Maybe ObjectCannedACL)
 poACL = lens _poACL (\s a -> s { _poACL = a })
 
 -- | Object data.
@@ -284,12 +284,12 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-poServerSideEncryption :: Lens' PutObject (Maybe Text)
+poServerSideEncryption :: Lens' PutObject (Maybe ServerSideEncryption)
 poServerSideEncryption =
     lens _poServerSideEncryption (\s a -> s { _poServerSideEncryption = a })
 
 -- | The type of storage to use for the object. Defaults to 'STANDARD'.
-poStorageClass :: Lens' PutObject (Maybe Text)
+poStorageClass :: Lens' PutObject (Maybe StorageClass)
 poStorageClass = lens _poStorageClass (\s a -> s { _poStorageClass = a })
 
 -- | If the bucket is configured as a website, redirects requests for this
@@ -306,9 +306,9 @@
     , _porSSECustomerAlgorithm :: Maybe Text
     , _porSSECustomerKeyMD5    :: Maybe Text
     , _porSSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _porServerSideEncryption :: Maybe Text
+    , _porServerSideEncryption :: Maybe ServerSideEncryption
     , _porVersionId            :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'PutObjectResponse' constructor.
 --
@@ -324,7 +324,7 @@
 --
 -- * 'porSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'porServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'porServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 -- * 'porVersionId' @::@ 'Maybe' 'Text'
 --
@@ -369,7 +369,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-porServerSideEncryption :: Lens' PutObjectResponse (Maybe Text)
+porServerSideEncryption :: Lens' PutObjectResponse (Maybe ServerSideEncryption)
 porServerSideEncryption =
     lens _porServerSideEncryption (\s a -> s { _porServerSideEncryption = a })
 
diff --git a/gen/Network/AWS/S3/PutObjectAcl.hs b/gen/Network/AWS/S3/PutObjectAcl.hs
--- a/gen/Network/AWS/S3/PutObjectAcl.hs
+++ b/gen/Network/AWS/S3/PutObjectAcl.hs
@@ -54,7 +54,7 @@
 import qualified GHC.Exts
 
 data PutObjectAcl = PutObjectAcl
-    { _poaACL                 :: Maybe Text
+    { _poaACL                 :: Maybe ObjectCannedACL
     , _poaAccessControlPolicy :: Maybe AccessControlPolicy
     , _poaBucket              :: Text
     , _poaContentMD5          :: Maybe Text
@@ -70,7 +70,7 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'poaACL' @::@ 'Maybe' 'Text'
+-- * 'poaACL' @::@ 'Maybe' 'ObjectCannedACL'
 --
 -- * 'poaAccessControlPolicy' @::@ 'Maybe' 'AccessControlPolicy'
 --
@@ -107,7 +107,7 @@
     }
 
 -- | The canned ACL to apply to the object.
-poaACL :: Lens' PutObjectAcl (Maybe Text)
+poaACL :: Lens' PutObjectAcl (Maybe ObjectCannedACL)
 poaACL = lens _poaACL (\s a -> s { _poaACL = a })
 
 poaAccessControlPolicy :: Lens' PutObjectAcl (Maybe AccessControlPolicy)
diff --git a/gen/Network/AWS/S3/Types.hs b/gen/Network/AWS/S3/Types.hs
--- a/gen/Network/AWS/S3/Types.hs
+++ b/gen/Network/AWS/S3/Types.hs
@@ -467,6 +467,10 @@
         S3ObjectCreatedPut                     -> "s3:ObjectCreated:Put"
         S3ReducedRedundancyLostObject          -> "s3:ReducedRedundancyLostObject"
 
+instance ToByteString Event
+instance ToHeader     Event
+instance ToQuery      Event
+
 instance FromXML Event where
     parseXML = parseXMLText "Event"
 
@@ -509,8 +513,8 @@
 data Transition = Transition
     { _tDate         :: Maybe ISO8601
     , _tDays         :: Maybe Int
-    , _tStorageClass :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    , _tStorageClass :: Maybe TransitionStorageClass
+    } deriving (Eq, Show)
 
 -- | 'Transition' constructor.
 --
@@ -520,7 +524,7 @@
 --
 -- * 'tDays' @::@ 'Maybe' 'Int'
 --
--- * 'tStorageClass' @::@ 'Maybe' 'Text'
+-- * 'tStorageClass' @::@ 'Maybe' 'TransitionStorageClass'
 --
 transition :: Transition
 transition = Transition
@@ -540,7 +544,7 @@
 tDays = lens _tDays (\s a -> s { _tDays = a })
 
 -- | The class of storage used to store the object.
-tStorageClass :: Lens' Transition (Maybe Text)
+tStorageClass :: Lens' Transition (Maybe TransitionStorageClass)
 tStorageClass = lens _tStorageClass (\s a -> s { _tStorageClass = a })
 
 instance FromXML Transition where
@@ -640,6 +644,10 @@
         Disabled -> "Disabled"
         Enabled  -> "Enabled"
 
+instance ToByteString ExpirationStatus
+instance ToHeader     ExpirationStatus
+instance ToQuery      ExpirationStatus
+
 instance FromXML ExpirationStatus where
     parseXML = parseXMLText "ExpirationStatus"
 
@@ -705,17 +713,17 @@
         ]
 
 data VersioningConfiguration = VersioningConfiguration
-    { _vcMFADelete :: Maybe Text
-    , _vcStatus    :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    { _vcMFADelete :: Maybe MFADelete
+    , _vcStatus    :: Maybe BucketVersioningStatus
+    } deriving (Eq, Show)
 
 -- | 'VersioningConfiguration' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'vcMFADelete' @::@ 'Maybe' 'Text'
+-- * 'vcMFADelete' @::@ 'Maybe' 'MFADelete'
 --
--- * 'vcStatus' @::@ 'Maybe' 'Text'
+-- * 'vcStatus' @::@ 'Maybe' 'BucketVersioningStatus'
 --
 versioningConfiguration :: VersioningConfiguration
 versioningConfiguration = VersioningConfiguration
@@ -727,11 +735,11 @@
 -- configuration. This element is only returned if the bucket has been
 -- configured with MFA delete. If the bucket has never been so configured,
 -- this element is not returned.
-vcMFADelete :: Lens' VersioningConfiguration (Maybe Text)
+vcMFADelete :: Lens' VersioningConfiguration (Maybe MFADelete)
 vcMFADelete = lens _vcMFADelete (\s a -> s { _vcMFADelete = a })
 
 -- | The versioning state of the bucket.
-vcStatus :: Lens' VersioningConfiguration (Maybe Text)
+vcStatus :: Lens' VersioningConfiguration (Maybe BucketVersioningStatus)
 vcStatus = lens _vcStatus (\s a -> s { _vcStatus = a })
 
 instance FromXML VersioningConfiguration where
@@ -804,6 +812,10 @@
         ReducedRedundancy -> "REDUCED_REDUNDANCY"
         Standard          -> "STANDARD"
 
+instance ToByteString ObjectStorageClass
+instance ToHeader     ObjectStorageClass
+instance ToQuery      ObjectStorageClass
+
 instance FromXML ObjectStorageClass where
     parseXML = parseXMLText "ObjectStorageClass"
 
@@ -826,6 +838,10 @@
         Copy    -> "COPY"
         Replace -> "REPLACE"
 
+instance ToByteString MetadataDirective
+instance ToHeader     MetadataDirective
+instance ToQuery      MetadataDirective
+
 instance FromXML MetadataDirective where
     parseXML = parseXMLText "MetadataDirective"
 
@@ -834,8 +850,8 @@
 
 data RedirectAllRequestsTo = RedirectAllRequestsTo
     { _rartHostName :: Text
-    , _rartProtocol :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    , _rartProtocol :: Maybe Protocol
+    } deriving (Eq, Show)
 
 -- | 'RedirectAllRequestsTo' constructor.
 --
@@ -843,7 +859,7 @@
 --
 -- * 'rartHostName' @::@ 'Text'
 --
--- * 'rartProtocol' @::@ 'Maybe' 'Text'
+-- * 'rartProtocol' @::@ 'Maybe' 'Protocol'
 --
 redirectAllRequestsTo :: Text -- ^ 'rartHostName'
                       -> RedirectAllRequestsTo
@@ -858,7 +874,7 @@
 
 -- | Protocol to use (http, https) when redirecting requests. The default is
 -- the protocol that is used in the original request.
-rartProtocol :: Lens' RedirectAllRequestsTo (Maybe Text)
+rartProtocol :: Lens' RedirectAllRequestsTo (Maybe Protocol)
 rartProtocol = lens _rartProtocol (\s a -> s { _rartProtocol = a })
 
 instance FromXML RedirectAllRequestsTo where
@@ -1048,6 +1064,10 @@
         PublicRead             -> "public-read"
         PublicReadWrite        -> "public-read-write"
 
+instance ToByteString ObjectCannedACL
+instance ToHeader     ObjectCannedACL
+instance ToQuery      ObjectCannedACL
+
 instance FromXML ObjectCannedACL where
     parseXML = parseXMLText "ObjectCannedACL"
 
@@ -1070,6 +1090,10 @@
         BVSEnabled   -> "Enabled"
         BVSSuspended -> "Suspended"
 
+instance ToByteString BucketVersioningStatus
+instance ToHeader     BucketVersioningStatus
+instance ToQuery      BucketVersioningStatus
+
 instance FromXML BucketVersioningStatus where
     parseXML = parseXMLText "BucketVersioningStatus"
 
@@ -1144,6 +1168,10 @@
 instance ToText ObjectVersionStorageClass where
     toText OVSCStandard = "STANDARD"
 
+instance ToByteString ObjectVersionStorageClass
+instance ToHeader     ObjectVersionStorageClass
+instance ToQuery      ObjectVersionStorageClass
+
 instance FromXML ObjectVersionStorageClass where
     parseXML = parseXMLText "ObjectVersionStorageClass"
 
@@ -1200,6 +1228,10 @@
 instance ToText EncodingType where
     toText Url = "url"
 
+instance ToByteString EncodingType
+instance ToHeader     EncodingType
+instance ToQuery      EncodingType
+
 instance FromXML EncodingType where
     parseXML = parseXMLText "EncodingType"
 
@@ -1207,23 +1239,23 @@
     toXML = toXMLText
 
 newtype RequestPaymentConfiguration = RequestPaymentConfiguration
-    { _rpcPayer :: Text
-    } deriving (Eq, Ord, Show, Monoid, IsString)
+    { _rpcPayer :: Payer
+    } deriving (Eq, Show)
 
 -- | 'RequestPaymentConfiguration' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'rpcPayer' @::@ 'Text'
+-- * 'rpcPayer' @::@ 'Payer'
 --
-requestPaymentConfiguration :: Text -- ^ 'rpcPayer'
+requestPaymentConfiguration :: Payer -- ^ 'rpcPayer'
                             -> RequestPaymentConfiguration
 requestPaymentConfiguration p1 = RequestPaymentConfiguration
     { _rpcPayer = p1
     }
 
 -- | Specifies who pays for the download and request fees.
-rpcPayer :: Lens' RequestPaymentConfiguration Text
+rpcPayer :: Lens' RequestPaymentConfiguration Payer
 rpcPayer = lens _rpcPayer (\s a -> s { _rpcPayer = a })
 
 instance FromXML RequestPaymentConfiguration where
@@ -1257,16 +1289,12 @@
 --
 -- * 'corsrMaxAgeSeconds' @::@ 'Maybe' 'Int'
 --
-corsrule :: [Text] -- ^ 'corsrAllowedHeaders'
-         -> [Text] -- ^ 'corsrAllowedMethods'
-         -> [Text] -- ^ 'corsrAllowedOrigins'
-         -> [Text] -- ^ 'corsrExposeHeaders'
-         -> CORSRule
-corsrule p1 p2 p3 p4 = CORSRule
-    { _corsrAllowedHeaders = withIso _List (const id) p1
-    , _corsrAllowedMethods = withIso _List (const id) p2
-    , _corsrAllowedOrigins = withIso _List (const id) p3
-    , _corsrExposeHeaders  = withIso _List (const id) p4
+corsrule :: CORSRule
+corsrule = CORSRule
+    { _corsrAllowedHeaders = mempty
+    , _corsrAllowedMethods = mempty
+    , _corsrAllowedOrigins = mempty
+    , _corsrExposeHeaders  = mempty
     , _corsrMaxAgeSeconds  = Nothing
     }
 
@@ -1378,8 +1406,8 @@
 
 data NoncurrentVersionTransition = NoncurrentVersionTransition
     { _nvtNoncurrentDays :: Int
-    , _nvtStorageClass   :: Text
-    } deriving (Eq, Ord, Show)
+    , _nvtStorageClass   :: TransitionStorageClass
+    } deriving (Eq, Show)
 
 -- | 'NoncurrentVersionTransition' constructor.
 --
@@ -1387,10 +1415,10 @@
 --
 -- * 'nvtNoncurrentDays' @::@ 'Int'
 --
--- * 'nvtStorageClass' @::@ 'Text'
+-- * 'nvtStorageClass' @::@ 'TransitionStorageClass'
 --
 noncurrentVersionTransition :: Int -- ^ 'nvtNoncurrentDays'
-                            -> Text -- ^ 'nvtStorageClass'
+                            -> TransitionStorageClass -- ^ 'nvtStorageClass'
                             -> NoncurrentVersionTransition
 noncurrentVersionTransition p1 p2 = NoncurrentVersionTransition
     { _nvtNoncurrentDays = p1
@@ -1406,7 +1434,7 @@
     lens _nvtNoncurrentDays (\s a -> s { _nvtNoncurrentDays = a })
 
 -- | The class of storage used to store the object.
-nvtStorageClass :: Lens' NoncurrentVersionTransition Text
+nvtStorageClass :: Lens' NoncurrentVersionTransition TransitionStorageClass
 nvtStorageClass = lens _nvtStorageClass (\s a -> s { _nvtStorageClass = a })
 
 instance FromXML NoncurrentVersionTransition where
@@ -1552,6 +1580,10 @@
         Http  -> "http"
         Https -> "https"
 
+instance ToByteString Protocol
+instance ToHeader     Protocol
+instance ToQuery      Protocol
+
 instance FromXML Protocol where
     parseXML = parseXMLText "Protocol"
 
@@ -1560,7 +1592,7 @@
 
 data Grant = Grant
     { _gGrantee    :: Maybe Grantee
-    , _gPermission :: Maybe Text
+    , _gPermission :: Maybe Permission
     } deriving (Eq, Show)
 
 -- | 'Grant' constructor.
@@ -1569,7 +1601,7 @@
 --
 -- * 'gGrantee' @::@ 'Maybe' 'Grantee'
 --
--- * 'gPermission' @::@ 'Maybe' 'Text'
+-- * 'gPermission' @::@ 'Maybe' 'Permission'
 --
 grant :: Grant
 grant = Grant
@@ -1581,7 +1613,7 @@
 gGrantee = lens _gGrantee (\s a -> s { _gGrantee = a })
 
 -- | Specifies the permission given to the grantee.
-gPermission :: Lens' Grant (Maybe Text)
+gPermission :: Lens' Grant (Maybe Permission)
 gPermission = lens _gPermission (\s a -> s { _gPermission = a })
 
 instance FromXML Grant where
@@ -1603,7 +1635,7 @@
     , _rNoncurrentVersionExpiration :: Maybe NoncurrentVersionExpiration
     , _rNoncurrentVersionTransition :: Maybe NoncurrentVersionTransition
     , _rPrefix                      :: Text
-    , _rStatus                      :: Text
+    , _rStatus                      :: ExpirationStatus
     , _rTransition                  :: Maybe Transition
     } deriving (Eq, Show)
 
@@ -1621,12 +1653,12 @@
 --
 -- * 'rPrefix' @::@ 'Text'
 --
--- * 'rStatus' @::@ 'Text'
+-- * 'rStatus' @::@ 'ExpirationStatus'
 --
 -- * 'rTransition' @::@ 'Maybe' 'Transition'
 --
 rule :: Text -- ^ 'rPrefix'
-     -> Text -- ^ 'rStatus'
+     -> ExpirationStatus -- ^ 'rStatus'
      -> Rule
 rule p1 p2 = Rule
     { _rPrefix                      = p1
@@ -1662,7 +1694,7 @@
 
 -- | If 'Enabled', the rule is currently being applied. If 'Disabled', the
 -- rule is not currently being applied.
-rStatus :: Lens' Rule Text
+rStatus :: Lens' Rule ExpirationStatus
 rStatus = lens _rStatus (\s a -> s { _rStatus = a })
 
 rTransition :: Lens' Rule (Maybe Transition)
@@ -1690,38 +1722,37 @@
         ]
 
 data TopicConfiguration = TopicConfiguration
-    { _tcEvent  :: Maybe Text
-    , _tcEvents :: List "Event" Text
+    { _tcEvent  :: Maybe Event
+    , _tcEvents :: List "Event" Event
     , _tcId     :: Maybe Text
     , _tcTopic  :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'TopicConfiguration' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'tcEvent' @::@ 'Maybe' 'Text'
+-- * 'tcEvent' @::@ 'Maybe' 'Event'
 --
--- * 'tcEvents' @::@ ['Text']
+-- * 'tcEvents' @::@ ['Event']
 --
 -- * 'tcId' @::@ 'Maybe' 'Text'
 --
 -- * 'tcTopic' @::@ 'Maybe' 'Text'
 --
-topicConfiguration :: [Text] -- ^ 'tcEvents'
-                   -> TopicConfiguration
-topicConfiguration p1 = TopicConfiguration
-    { _tcEvents = withIso _List (const id) p1
-    , _tcId     = Nothing
+topicConfiguration :: TopicConfiguration
+topicConfiguration = TopicConfiguration
+    { _tcId     = Nothing
+    , _tcEvents = mempty
     , _tcEvent  = Nothing
     , _tcTopic  = Nothing
     }
 
 -- | Bucket event for which to send notifications.
-tcEvent :: Lens' TopicConfiguration (Maybe Text)
+tcEvent :: Lens' TopicConfiguration (Maybe Event)
 tcEvent = lens _tcEvent (\s a -> s { _tcEvent = a })
 
-tcEvents :: Lens' TopicConfiguration [Text]
+tcEvents :: Lens' TopicConfiguration [Event]
 tcEvents = lens _tcEvents (\s a -> s { _tcEvents = a }) . _List
 
 tcId :: Lens' TopicConfiguration (Maybe Text)
@@ -1748,37 +1779,36 @@
         ]
 
 data QueueConfiguration = QueueConfiguration
-    { _qcEvent  :: Maybe Text
-    , _qcEvents :: List "Event" Text
+    { _qcEvent  :: Maybe Event
+    , _qcEvents :: List "Event" Event
     , _qcId     :: Maybe Text
     , _qcQueue  :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'QueueConfiguration' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'qcEvent' @::@ 'Maybe' 'Text'
+-- * 'qcEvent' @::@ 'Maybe' 'Event'
 --
--- * 'qcEvents' @::@ ['Text']
+-- * 'qcEvents' @::@ ['Event']
 --
 -- * 'qcId' @::@ 'Maybe' 'Text'
 --
 -- * 'qcQueue' @::@ 'Maybe' 'Text'
 --
-queueConfiguration :: [Text] -- ^ 'qcEvents'
-                   -> QueueConfiguration
-queueConfiguration p1 = QueueConfiguration
-    { _qcEvents = withIso _List (const id) p1
-    , _qcId     = Nothing
+queueConfiguration :: QueueConfiguration
+queueConfiguration = QueueConfiguration
+    { _qcId     = Nothing
     , _qcEvent  = Nothing
+    , _qcEvents = mempty
     , _qcQueue  = Nothing
     }
 
-qcEvent :: Lens' QueueConfiguration (Maybe Text)
+qcEvent :: Lens' QueueConfiguration (Maybe Event)
 qcEvent = lens _qcEvent (\s a -> s { _qcEvent = a })
 
-qcEvents :: Lens' QueueConfiguration [Text]
+qcEvents :: Lens' QueueConfiguration [Event]
 qcEvents = lens _qcEvents (\s a -> s { _qcEvents = a }) . _List
 
 qcId :: Lens' QueueConfiguration (Maybe Text)
@@ -1913,6 +1943,10 @@
         SCReducedRedundancy -> "REDUCED_REDUNDANCY"
         SCStandard          -> "STANDARD"
 
+instance ToByteString StorageClass
+instance ToHeader     StorageClass
+instance ToQuery      StorageClass
+
 instance FromXML StorageClass where
     parseXML = parseXMLText "StorageClass"
 
@@ -1926,7 +1960,7 @@
     , _ovLastModified :: Maybe RFC822
     , _ovOwner        :: Maybe Owner
     , _ovSize         :: Maybe Int
-    , _ovStorageClass :: Maybe Text
+    , _ovStorageClass :: Maybe ObjectVersionStorageClass
     , _ovVersionId    :: Maybe Text
     } deriving (Eq, Show)
 
@@ -1946,7 +1980,7 @@
 --
 -- * 'ovSize' @::@ 'Maybe' 'Int'
 --
--- * 'ovStorageClass' @::@ 'Maybe' 'Text'
+-- * 'ovStorageClass' @::@ 'Maybe' 'ObjectVersionStorageClass'
 --
 -- * 'ovVersionId' @::@ 'Maybe' 'Text'
 --
@@ -1986,7 +2020,7 @@
 ovSize = lens _ovSize (\s a -> s { _ovSize = a })
 
 -- | The class of storage used to store the object.
-ovStorageClass :: Lens' ObjectVersion (Maybe Text)
+ovStorageClass :: Lens' ObjectVersion (Maybe ObjectVersionStorageClass)
 ovStorageClass = lens _ovStorageClass (\s a -> s { _ovStorageClass = a })
 
 -- | Version ID of an object.
@@ -2018,7 +2052,7 @@
 
 data TargetGrant = TargetGrant
     { _tgGrantee    :: Maybe Grantee
-    , _tgPermission :: Maybe Text
+    , _tgPermission :: Maybe BucketLogsPermission
     } deriving (Eq, Show)
 
 -- | 'TargetGrant' constructor.
@@ -2027,7 +2061,7 @@
 --
 -- * 'tgGrantee' @::@ 'Maybe' 'Grantee'
 --
--- * 'tgPermission' @::@ 'Maybe' 'Text'
+-- * 'tgPermission' @::@ 'Maybe' 'BucketLogsPermission'
 --
 targetGrant :: TargetGrant
 targetGrant = TargetGrant
@@ -2039,7 +2073,7 @@
 tgGrantee = lens _tgGrantee (\s a -> s { _tgGrantee = a })
 
 -- | Logging permissions assigned to the Grantee for the bucket.
-tgPermission :: Lens' TargetGrant (Maybe Text)
+tgPermission :: Lens' TargetGrant (Maybe BucketLogsPermission)
 tgPermission = lens _tgPermission (\s a -> s { _tgPermission = a })
 
 instance FromXML TargetGrant where
@@ -2069,6 +2103,10 @@
         MFADSDisabled -> "Disabled"
         MFADSEnabled  -> "Enabled"
 
+instance ToByteString MFADeleteStatus
+instance ToHeader     MFADeleteStatus
+instance ToQuery      MFADeleteStatus
+
 instance FromXML MFADeleteStatus where
     parseXML = parseXMLText "MFADeleteStatus"
 
@@ -2091,6 +2129,10 @@
         BucketOwner -> "BucketOwner"
         Requester   -> "Requester"
 
+instance ToByteString Payer
+instance ToHeader     Payer
+instance ToQuery      Payer
+
 instance FromXML Payer where
     parseXML = parseXMLText "Payer"
 
@@ -2100,10 +2142,10 @@
 data Redirect = Redirect
     { _rHostName             :: Maybe Text
     , _rHttpRedirectCode     :: Maybe Text
-    , _rProtocol             :: Maybe Text
+    , _rProtocol             :: Maybe Protocol
     , _rReplaceKeyPrefixWith :: Maybe Text
     , _rReplaceKeyWith       :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'Redirect' constructor.
 --
@@ -2113,7 +2155,7 @@
 --
 -- * 'rHttpRedirectCode' @::@ 'Maybe' 'Text'
 --
--- * 'rProtocol' @::@ 'Maybe' 'Text'
+-- * 'rProtocol' @::@ 'Maybe' 'Protocol'
 --
 -- * 'rReplaceKeyPrefixWith' @::@ 'Maybe' 'Text'
 --
@@ -2140,7 +2182,7 @@
 
 -- | Protocol to use (http, https) when redirecting requests. The default is
 -- the protocol that is used in the original request.
-rProtocol :: Lens' Redirect (Maybe Text)
+rProtocol :: Lens' Redirect (Maybe Protocol)
 rProtocol = lens _rProtocol (\s a -> s { _rProtocol = a })
 
 -- | The object key prefix to use in the redirect request. For example, to
@@ -2195,6 +2237,10 @@
         Read        -> "READ"
         Write       -> "WRITE"
 
+instance ToByteString BucketLogsPermission
+instance ToHeader     BucketLogsPermission
+instance ToQuery      BucketLogsPermission
+
 instance FromXML BucketLogsPermission where
     parseXML = parseXMLText "BucketLogsPermission"
 
@@ -2240,14 +2286,14 @@
         ]
 
 newtype CreateBucketConfiguration = CreateBucketConfiguration
-    { _cbcLocationConstraint :: Maybe Text
-    } deriving (Eq, Ord, Show, Monoid)
+    { _cbcLocationConstraint :: Maybe Region
+    } deriving (Eq, Show)
 
 -- | 'CreateBucketConfiguration' constructor.
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'cbcLocationConstraint' @::@ 'Maybe' 'Text'
+-- * 'cbcLocationConstraint' @::@ 'Maybe' 'Region'
 --
 createBucketConfiguration :: CreateBucketConfiguration
 createBucketConfiguration = CreateBucketConfiguration
@@ -2255,7 +2301,7 @@
     }
 
 -- | Specifies the region where the bucket will be created.
-cbcLocationConstraint :: Lens' CreateBucketConfiguration (Maybe Text)
+cbcLocationConstraint :: Lens' CreateBucketConfiguration (Maybe Region)
 cbcLocationConstraint =
     lens _cbcLocationConstraint (\s a -> s { _cbcLocationConstraint = a })
 
@@ -2351,10 +2397,9 @@
 --
 -- * 'corscCORSRules' @::@ ['CORSRule']
 --
-corsconfiguration :: [CORSRule] -- ^ 'corscCORSRules'
-                  -> CORSConfiguration
-corsconfiguration p1 = CORSConfiguration
-    { _corscCORSRules = withIso _List (const id) p1
+corsconfiguration :: CORSConfiguration
+corsconfiguration = CORSConfiguration
+    { _corscCORSRules = mempty
     }
 
 corscCORSRules :: Lens' CORSConfiguration [CORSRule]
@@ -2375,7 +2420,7 @@
     , _oLastModified :: RFC822
     , _oOwner        :: Owner
     , _oSize         :: Int
-    , _oStorageClass :: Text
+    , _oStorageClass :: ObjectStorageClass
     } deriving (Eq, Show)
 
 -- | 'Object' constructor.
@@ -2392,13 +2437,13 @@
 --
 -- * 'oSize' @::@ 'Int'
 --
--- * 'oStorageClass' @::@ 'Text'
+-- * 'oStorageClass' @::@ 'ObjectStorageClass'
 --
 object' :: Text -- ^ 'oKey'
         -> UTCTime -- ^ 'oLastModified'
         -> Text -- ^ 'oETag'
         -> Int -- ^ 'oSize'
-        -> Text -- ^ 'oStorageClass'
+        -> ObjectStorageClass -- ^ 'oStorageClass'
         -> Owner -- ^ 'oOwner'
         -> Object
 object' p1 p2 p3 p4 p5 p6 = Object
@@ -2426,7 +2471,7 @@
 oSize = lens _oSize (\s a -> s { _oSize = a })
 
 -- | The class of storage used to store the object.
-oStorageClass :: Lens' Object Text
+oStorageClass :: Lens' Object ObjectStorageClass
 oStorageClass = lens _oStorageClass (\s a -> s { _oStorageClass = a })
 
 instance FromXML Object where
@@ -2470,19 +2515,17 @@
     parseXML x = CommonPrefix
         <$> x .@? "Prefix"
 
-instance ToXMLRoot CommonPrefix where
-    toXMLRoot CommonPrefix{..} = namespaced ns "CommonPrefix"
+instance ToXML CommonPrefix where
+    toXML CommonPrefix{..} = nodes "CommonPrefix"
         [ "Prefix" =@ _cpPrefix
         ]
 
-instance ToXML CommonPrefix
-
 data MultipartUpload = MultipartUpload
     { _muInitiated    :: Maybe RFC822
     , _muInitiator    :: Maybe Initiator
     , _muKey          :: Maybe Text
     , _muOwner        :: Maybe Owner
-    , _muStorageClass :: Maybe Text
+    , _muStorageClass :: Maybe StorageClass
     , _muUploadId     :: Maybe Text
     } deriving (Eq, Show)
 
@@ -2498,7 +2541,7 @@
 --
 -- * 'muOwner' @::@ 'Maybe' 'Owner'
 --
--- * 'muStorageClass' @::@ 'Maybe' 'Text'
+-- * 'muStorageClass' @::@ 'Maybe' 'StorageClass'
 --
 -- * 'muUploadId' @::@ 'Maybe' 'Text'
 --
@@ -2528,7 +2571,7 @@
 muOwner = lens _muOwner (\s a -> s { _muOwner = a })
 
 -- | The class of storage used to store the object.
-muStorageClass :: Lens' MultipartUpload (Maybe Text)
+muStorageClass :: Lens' MultipartUpload (Maybe StorageClass)
 muStorageClass = lens _muStorageClass (\s a -> s { _muStorageClass = a })
 
 -- | Upload ID that identifies the multipart upload.
@@ -2573,6 +2616,10 @@
         CanonicalUser         -> "CanonicalUser"
         Group                 -> "Group"
 
+instance ToByteString Type
+instance ToHeader     Type
+instance ToQuery      Type
+
 instance FromXML Type where
     parseXML = parseXMLText "Type"
 
@@ -2591,6 +2638,10 @@
 instance ToText TransitionStorageClass where
     toText TSCGlacier = "GLACIER"
 
+instance ToByteString TransitionStorageClass
+instance ToHeader     TransitionStorageClass
+instance ToQuery      TransitionStorageClass
+
 instance FromXML TransitionStorageClass where
     parseXML = parseXMLText "TransitionStorageClass"
 
@@ -2607,10 +2658,9 @@
 --
 -- * 'cmuParts' @::@ ['CompletedPart']
 --
-completedMultipartUpload :: [CompletedPart] -- ^ 'cmuParts'
-                         -> CompletedMultipartUpload
-completedMultipartUpload p1 = CompletedMultipartUpload
-    { _cmuParts = withIso _List (const id) p1
+completedMultipartUpload :: CompletedMultipartUpload
+completedMultipartUpload = CompletedMultipartUpload
+    { _cmuParts = mempty
     }
 
 cmuParts :: Lens' CompletedMultipartUpload [CompletedPart]
@@ -2700,6 +2750,10 @@
         PWrite       -> "WRITE"
         PWriteAcp    -> "WRITE_ACP"
 
+instance ToByteString Permission
+instance ToHeader     Permission
+instance ToQuery      Permission
+
 instance FromXML Permission where
     parseXML = parseXMLText "Permission"
 
@@ -2767,6 +2821,10 @@
         CannedPublicRead        -> "public-read"
         CannedPublicReadWrite   -> "public-read-write"
 
+instance ToByteString BucketCannedACL
+instance ToHeader     BucketCannedACL
+instance ToQuery      BucketCannedACL
+
 instance FromXML BucketCannedACL where
     parseXML = parseXMLText "BucketCannedACL"
 
@@ -2789,6 +2847,10 @@
         MFADDisabled -> "Disabled"
         MFADEnabled  -> "Enabled"
 
+instance ToByteString MFADelete
+instance ToHeader     MFADelete
+instance ToQuery      MFADelete
+
 instance FromXML MFADelete where
     parseXML = parseXMLText "MFADelete"
 
@@ -2797,11 +2859,11 @@
 
 data CloudFunctionConfiguration = CloudFunctionConfiguration
     { _cfcCloudFunction  :: Maybe Text
-    , _cfcEvent          :: Maybe Text
-    , _cfcEvents         :: List "Event" Text
+    , _cfcEvent          :: Maybe Event
+    , _cfcEvents         :: List "Event" Event
     , _cfcId             :: Maybe Text
     , _cfcInvocationRole :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'CloudFunctionConfiguration' constructor.
 --
@@ -2809,20 +2871,19 @@
 --
 -- * 'cfcCloudFunction' @::@ 'Maybe' 'Text'
 --
--- * 'cfcEvent' @::@ 'Maybe' 'Text'
+-- * 'cfcEvent' @::@ 'Maybe' 'Event'
 --
--- * 'cfcEvents' @::@ ['Text']
+-- * 'cfcEvents' @::@ ['Event']
 --
 -- * 'cfcId' @::@ 'Maybe' 'Text'
 --
 -- * 'cfcInvocationRole' @::@ 'Maybe' 'Text'
 --
-cloudFunctionConfiguration :: [Text] -- ^ 'cfcEvents'
-                           -> CloudFunctionConfiguration
-cloudFunctionConfiguration p1 = CloudFunctionConfiguration
-    { _cfcEvents         = withIso _List (const id) p1
-    , _cfcId             = Nothing
+cloudFunctionConfiguration :: CloudFunctionConfiguration
+cloudFunctionConfiguration = CloudFunctionConfiguration
+    { _cfcId             = Nothing
     , _cfcEvent          = Nothing
+    , _cfcEvents         = mempty
     , _cfcCloudFunction  = Nothing
     , _cfcInvocationRole = Nothing
     }
@@ -2830,10 +2891,10 @@
 cfcCloudFunction :: Lens' CloudFunctionConfiguration (Maybe Text)
 cfcCloudFunction = lens _cfcCloudFunction (\s a -> s { _cfcCloudFunction = a })
 
-cfcEvent :: Lens' CloudFunctionConfiguration (Maybe Text)
+cfcEvent :: Lens' CloudFunctionConfiguration (Maybe Event)
 cfcEvent = lens _cfcEvent (\s a -> s { _cfcEvent = a })
 
-cfcEvents :: Lens' CloudFunctionConfiguration [Text]
+cfcEvents :: Lens' CloudFunctionConfiguration [Event]
 cfcEvents = lens _cfcEvents (\s a -> s { _cfcEvents = a }) . _List
 
 cfcId :: Lens' CloudFunctionConfiguration (Maybe Text)
@@ -2864,9 +2925,9 @@
     { _gDisplayName  :: Maybe Text
     , _gEmailAddress :: Maybe Text
     , _gID           :: Maybe Text
-    , _gType         :: Text
+    , _gType         :: Type
     , _gURI          :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'Grantee' constructor.
 --
@@ -2878,11 +2939,11 @@
 --
 -- * 'gID' @::@ 'Maybe' 'Text'
 --
--- * 'gType' @::@ 'Text'
+-- * 'gType' @::@ 'Type'
 --
 -- * 'gURI' @::@ 'Maybe' 'Text'
 --
-grantee :: Text -- ^ 'gType'
+grantee :: Type -- ^ 'gType'
         -> Grantee
 grantee p1 = Grantee
     { _gType         = p1
@@ -2905,7 +2966,7 @@
 gID = lens _gID (\s a -> s { _gID = a })
 
 -- | Type of grantee.
-gType :: Lens' Grantee Text
+gType :: Lens' Grantee Type
 gType = lens _gType (\s a -> s { _gType = a })
 
 -- | URI of the grantee group.
@@ -2939,10 +3000,9 @@
 --
 -- * 'lcRules' @::@ ['Rule']
 --
-lifecycleConfiguration :: [Rule] -- ^ 'lcRules'
-                       -> LifecycleConfiguration
-lifecycleConfiguration p1 = LifecycleConfiguration
-    { _lcRules = withIso _List (const id) p1
+lifecycleConfiguration :: LifecycleConfiguration
+lifecycleConfiguration = LifecycleConfiguration
+    { _lcRules = mempty
     }
 
 lcRules :: Lens' LifecycleConfiguration [Rule]
@@ -3022,6 +3082,10 @@
 instance ToText ServerSideEncryption where
     toText AES256 = "AES256"
 
+instance ToByteString ServerSideEncryption
+instance ToHeader     ServerSideEncryption
+instance ToQuery      ServerSideEncryption
+
 instance FromXML ServerSideEncryption where
     parseXML = parseXMLText "ServerSideEncryption"
 
@@ -3110,10 +3174,9 @@
 --
 -- * 'dQuiet' @::@ 'Maybe' 'Bool'
 --
-delete' :: [ObjectIdentifier] -- ^ 'dObjects'
-        -> Delete
-delete' p1 = Delete
-    { _dObjects = withIso _List (const id) p1
+delete' :: Delete
+delete' = Delete
+    { _dObjects = mempty
     , _dQuiet   = Nothing
     }
 
diff --git a/gen/Network/AWS/S3/UploadPart.hs b/gen/Network/AWS/S3/UploadPart.hs
--- a/gen/Network/AWS/S3/UploadPart.hs
+++ b/gen/Network/AWS/S3/UploadPart.hs
@@ -181,8 +181,8 @@
     , _uprSSECustomerAlgorithm :: Maybe Text
     , _uprSSECustomerKeyMD5    :: Maybe Text
     , _uprSSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _uprServerSideEncryption :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    , _uprServerSideEncryption :: Maybe ServerSideEncryption
+    } deriving (Eq, Show)
 
 -- | 'UploadPartResponse' constructor.
 --
@@ -196,7 +196,7 @@
 --
 -- * 'uprSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'uprServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'uprServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 uploadPartResponse :: UploadPartResponse
 uploadPartResponse = UploadPartResponse
@@ -231,7 +231,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-uprServerSideEncryption :: Lens' UploadPartResponse (Maybe Text)
+uprServerSideEncryption :: Lens' UploadPartResponse (Maybe ServerSideEncryption)
 uprServerSideEncryption =
     lens _uprServerSideEncryption (\s a -> s { _uprServerSideEncryption = a })
 
diff --git a/gen/Network/AWS/S3/UploadPartCopy.hs b/gen/Network/AWS/S3/UploadPartCopy.hs
--- a/gen/Network/AWS/S3/UploadPartCopy.hs
+++ b/gen/Network/AWS/S3/UploadPartCopy.hs
@@ -266,7 +266,7 @@
     , _upcrSSECustomerAlgorithm :: Maybe Text
     , _upcrSSECustomerKeyMD5    :: Maybe Text
     , _upcrSSEKMSKeyId          :: Maybe (Sensitive Text)
-    , _upcrServerSideEncryption :: Maybe Text
+    , _upcrServerSideEncryption :: Maybe ServerSideEncryption
     } deriving (Eq, Show)
 
 -- | 'UploadPartCopyResponse' constructor.
@@ -283,7 +283,7 @@
 --
 -- * 'upcrSSEKMSKeyId' @::@ 'Maybe' 'Text'
 --
--- * 'upcrServerSideEncryption' @::@ 'Maybe' 'Text'
+-- * 'upcrServerSideEncryption' @::@ 'Maybe' 'ServerSideEncryption'
 --
 uploadPartCopyResponse :: UploadPartCopyResponse
 uploadPartCopyResponse = UploadPartCopyResponse
@@ -326,7 +326,7 @@
 
 -- | The Server-side encryption algorithm used when storing this object in S3
 -- (e.g., AES256, aws:kms).
-upcrServerSideEncryption :: Lens' UploadPartCopyResponse (Maybe Text)
+upcrServerSideEncryption :: Lens' UploadPartCopyResponse (Maybe ServerSideEncryption)
 upcrServerSideEncryption =
     lens _upcrServerSideEncryption
         (\s a -> s { _upcrServerSideEncryption = a })
