diff --git a/AWS.hs b/AWS.hs
--- a/AWS.hs
+++ b/AWS.hs
@@ -33,6 +33,7 @@
     ( -- * Credentials
       Credential
     , loadCredential
+    , newCredential
       -- * Environment
     , AWS
     , AWSException(..)
diff --git a/AWS/Credential.hs b/AWS/Credential.hs
--- a/AWS/Credential.hs
+++ b/AWS/Credential.hs
@@ -4,6 +4,7 @@
     , AccessKey
     , SecretAccessKey
     , loadCredential
+    , newCredential
     ) where
 
 import Data.ByteString (ByteString)
@@ -20,9 +21,14 @@
 type AccessKey = ByteString
 type SecretAccessKey = ByteString
 
+-- | Load credential from \"./aws.config\".
 loadCredential :: IO Credential
 loadCredential = do
     str <- BS.readFile "aws.config"
     case parse configParser "" str of
         Left err   -> fail $ show err
         Right conf -> return conf
+
+-- | Create new credential.
+newCredential :: AccessKey -> SecretAccessKey -> Credential
+newCredential key secret = Credential key secret
diff --git a/AWS/EC2/Address.hs b/AWS/EC2/Address.hs
--- a/AWS/EC2/Address.hs
+++ b/AWS/EC2/Address.hs
@@ -5,9 +5,9 @@
     , allocateAddress
     , releaseAddress
     , associateAddress
-    , AssociateAddressParam(..)
+    , AssociateAddressRequest(..)
     , disassociateAddress
-    , DisassociateAddressParam(..)
+    , DisassociateAddressRequest(..)
     ) where
 
 import Data.Text (Text)
@@ -88,7 +88,7 @@
 -----------------------------------------------------
 associateAddress
     :: (MonadResource m, MonadBaseControl IO m)
-    => AssociateAddressParam
+    => AssociateAddressRequest
     -> EC2 m (Bool, Maybe Text)
 associateAddress param = ec2Query "AssociateAddress" params $
     (,) <$> getF "return" textToBool
@@ -96,22 +96,8 @@
   where
     params = associateAddressParam param
 
-data AssociateAddressParam
-    = AAEC2Instance
-        { aaec2PublicIp :: Text
-        , aaec2InstanceId :: Text
-        }
-    | AAVPCInstance
-        { aavpcAllocationId :: Text
-        , aavpcInstanceId :: Maybe Text
-        , aavpcNetworkInterfaceId :: Maybe Text
-        , aavpcPrivateIpAddress :: Maybe Text
-        , aavpcAllowReassociation :: Maybe Bool
-        }
-  deriving (Show)
-
 associateAddressParam
-    :: AssociateAddressParam -> [QueryParam]
+    :: AssociateAddressRequest -> [QueryParam]
 associateAddressParam (AAEC2Instance ip iid) =
     [ ValueParam "PublicIp" ip
     , ValueParam "InstanceId" iid
@@ -127,7 +113,7 @@
 
 disassociateAddress
     :: (MonadResource m, MonadBaseControl IO m)
-    => DisassociateAddressParam
+    => DisassociateAddressRequest
     -> EC2 m Bool
 disassociateAddress param =
     ec2Query "DisassociateAddress" (p param)
@@ -135,8 +121,3 @@
   where
     p (DAEC2 pip) = [ValueParam "PublicIp" pip]
     p (DAVPC aid) = [ValueParam "AssociationId" aid]
-
-data DisassociateAddressParam
-    = DAEC2 Text -- ^ PublicIp for EC2
-    | DAVPC Text -- ^ AssociationId for VPC
-  deriving (Show)
diff --git a/AWS/EC2/Image.hs b/AWS/EC2/Image.hs
--- a/AWS/EC2/Image.hs
+++ b/AWS/EC2/Image.hs
@@ -4,7 +4,6 @@
     ( describeImages
     , createImage
     , registerImage
-    , RegisterImageRequest(..)
     , deregisterImage
     ) where
 
@@ -96,18 +95,6 @@
         , ValueParam "NoReboot" (boolToText noReboot)
         ] ++ param "Description" desc
           ++ [blockDeviceMappingParams bdms]
-
-data RegisterImageRequest = RegisterImageRequest
-    { rirName :: Text
-    , rirImageLocation :: Maybe Text
-    , rirDescription :: Maybe Text
-    , rirArchitecture :: Maybe Text
-    , rirKernelId :: Maybe Text
-    , rirRamdiskId :: Maybe Text
-    , rirRootDeviceName :: Maybe Text
-    , rirBlockDeviceMappings :: [BlockDeviceMappingParam]
-    }
-  deriving (Show)
 
 registerImage
     :: (MonadResource m, MonadBaseControl IO m)
diff --git a/AWS/EC2/Instance.hs b/AWS/EC2/Instance.hs
--- a/AWS/EC2/Instance.hs
+++ b/AWS/EC2/Instance.hs
@@ -3,8 +3,7 @@
 module AWS.EC2.Instance
     ( describeInstances
     , runInstances
-    , RunInstancesParam(..)
-    , defaultRunInstancesParam
+    , defaultRunInstancesRequest
     , terminateInstances
     , startInstances
     , stopInstances
@@ -13,16 +12,11 @@
     , getPasswordData
     , describeInstanceStatus
     , describeInstanceAttribute
-    , InstanceAttributeRequest(..)
     , resetInstanceAttribute
-    , ResetInstanceAttributeParam(..)
     , modifyInstanceAttribute
-    , ModifyInstanceAttributeParam(..)
     ) where
 
 import Data.Text (Text)
-import Data.ByteString (ByteString)
-
 import Data.XML.Types (Event)
 import Data.Conduit
 import Control.Monad.Trans.Control (MonadBaseControl)
@@ -294,7 +288,7 @@
 -- | 'RunInstancesParam' is genereted with 'defaultRunInstancesParam'
 runInstances
     :: (MonadResource m, MonadBaseControl IO m)
-    => RunInstancesParam
+    => RunInstancesRequest
     -> EC2 m Reservation
 runInstances param =
     ec2Query "RunInstances" params reservationSink
@@ -331,43 +325,14 @@
             , ("EbsOptimized", boolToText <$> riEbsOptimized param)
             ]
 
-data RunInstancesParam = RunInstancesParam
-    { riImageId :: Text -- ^ Required
-    , riMinCount :: Int -- ^ Required
-    , riMaxCount :: Int -- ^ Required
-    , riKeyName :: Maybe Text
-    , riSecurityGroupIds :: [Text]
-      -- ^ SecurityGroupIds (Required for VPC; optional for EC2)
-    , riSecurityGroups :: [Text]
-      -- ^ SecurityGroups (Only for EC2; either id or name is accepted)
-    , riUserData :: Maybe ByteString
-      -- ^ UserData (Base64-encoded MIME user data)
-    , riInstanceType :: Maybe Text
-    , riAvailabilityZone :: Maybe Text
-    , riPlacementGroup :: Maybe Text
-    , riTenancy :: Maybe Text
-    , riKernelId :: Maybe Text
-    , riRamdiskId :: Maybe Text
-    , riBlockDeviceMappings :: [BlockDeviceMappingParam]
-    , riMonitoringEnabled :: Maybe Bool
-    , riSubnetId :: Maybe Text
-    , riDisableApiTermination :: Maybe Bool
-    , riShutdownBehavior :: Maybe ShutdownBehavior
-    , riPrivateIpAddresses :: [Text] -- ^ XXX: not implemented
-    , riClientToken :: Maybe Text
-    , riNetworkInterface :: [NetworkInterfaceParam] -- ^ XXX: not implemented
-    , riIamInstanceProfile :: Maybe IamInstanceProfile
-    , riEbsOptimized :: Maybe Bool
-    }
-  deriving (Show)
-
 -- | RunInstances parameter utility
-defaultRunInstancesParam
+defaultRunInstancesRequest
     :: Text -- ^ ImageId
     -> Int -- ^ MinCount
     -> Int -- ^ MaxCount
-    -> RunInstancesParam
-defaultRunInstancesParam iid minCount maxCount = RunInstancesParam
+    -> RunInstancesRequest
+defaultRunInstancesRequest iid minCount maxCount
+    = RunInstancesRequest
     { riImageId = iid
     , riMinCount = minCount
     , riMaxCount = maxCount
@@ -463,21 +428,6 @@
     valueSink name val =
         (element name $ getMT "value") >>= return . val
 
-data InstanceAttributeRequest
-    = IARInstanceType
-    | IARKernelId
-    | IARRamdiskId
-    | IARUserData
-    | IARDisableApiTermination
-    | IARShutdownBehavior
-    | IARRootDeviceName
-    | IARBlockDeviceMapping
-    | IARSourceDestCheck
-    | IARGroupSet
-    | IARProductCodes
-    | IAREbsOptimized
-  deriving (Show, Eq, Ord)
-
 iar :: InstanceAttributeRequest -> Text
 iar IARInstanceType          = "instanceType"
 iar IARKernelId              = "kernel"
@@ -492,12 +442,7 @@
 iar IARProductCodes          = "productCodes"
 iar IAREbsOptimized          = "ebsOptimized"
 
-data ResetInstanceAttributeParam
-    = RIAPKernel
-    | RIAPRamdisk
-    | RIAPSourceDestCheck
-
-riap :: ResetInstanceAttributeParam -> Text
+riap :: ResetInstanceAttributeRequest -> Text
 riap RIAPKernel          = "kernel"
 riap RIAPRamdisk         = "ramdisk"
 riap RIAPSourceDestCheck = "sourceDestCheck"
@@ -505,7 +450,7 @@
 resetInstanceAttribute
     :: (MonadResource m, MonadBaseControl IO m)
     => Text -- ^ InstanceId
-    -> ResetInstanceAttributeParam
+    -> ResetInstanceAttributeRequest
     -> EC2 m Bool
 resetInstanceAttribute iid attr =
     ec2Query "ResetInstanceAttribute" params returnBool
@@ -519,28 +464,14 @@
 modifyInstanceAttribute
     :: (MonadResource m, MonadBaseControl IO m)
     => Text -- ^ InstanceId
-    -> [ModifyInstanceAttributeParam]
+    -> [ModifyInstanceAttributeRequest]
     -> EC2 m Bool
 modifyInstanceAttribute iid attrs =
     ec2Query "ModifyInstanceAttribute" params returnBool
   where
     params = ValueParam "InstanceId" iid:concatMap miap attrs
 
-data ModifyInstanceAttributeParam
-    = MIAPInstanceType Text
-    | MIAPKernelId Text
-    | MIAPRamdiskId Text
-    | MIAPUserData Text
-    | MIAPDisableApiTermination Bool
-    | MIAPShutdownBehavior ShutdownBehavior
-    | MIAPRootDeviceName Text
-    | MIAPBlockDeviceMapping [BlockDeviceMappingParam]
-    | MIAPSourceDestCheck Bool
-    | MIAPGroupSet [Text]
-    | MIAPEbsOptimized Bool
-  deriving (Show)
-
-miap :: ModifyInstanceAttributeParam -> [QueryParam]
+miap :: ModifyInstanceAttributeRequest -> [QueryParam]
 miap (MIAPInstanceType a) =
     [ValueParam "InstanceType.Value" a]
 miap (MIAPKernelId a) =
diff --git a/AWS/EC2/SecurityGroup.hs b/AWS/EC2/SecurityGroup.hs
--- a/AWS/EC2/SecurityGroup.hs
+++ b/AWS/EC2/SecurityGroup.hs
@@ -4,7 +4,6 @@
     ( describeSecurityGroups
     , createSecurityGroup
     , deleteSecurityGroup
-    , SecurityGroupParam(..)
     , authorizeSecurityGroupIngress
     , authorizeSecurityGroupEgress
     , revokeSecurityGroupIngress
@@ -81,23 +80,20 @@
 
 deleteSecurityGroup
     :: (MonadResource m, MonadBaseControl IO m)
-    => SecurityGroupParam
+    => SecurityGroupRequest
     -> EC2 m Bool
 deleteSecurityGroup param =
     ec2Query "DeleteSecurityGroup" [p param]
         $ getF "return" textToBool
 
-p :: SecurityGroupParam -> QueryParam
+p :: SecurityGroupRequest -> QueryParam
 p (GroupId t)   = ValueParam "GroupId" t
 p (GroupName t) = ValueParam "GroupName" t
 
-data SecurityGroupParam = GroupId Text | GroupName Text
-  deriving (Show)
-
 -- | not tested
 authorizeSecurityGroupIngress
     :: (MonadResource m, MonadBaseControl IO m)
-    => SecurityGroupParam
+    => SecurityGroupRequest
     -> [IpPermission]
     -> EC2 m Bool
 authorizeSecurityGroupIngress =
@@ -116,7 +112,7 @@
 -- | not tested
 revokeSecurityGroupIngress
     :: (MonadResource m, MonadBaseControl IO m)
-    => SecurityGroupParam
+    => SecurityGroupRequest
     -> [IpPermission]
     -> EC2 m Bool
 revokeSecurityGroupIngress =
@@ -135,7 +131,7 @@
 securityGroupQuery
     :: (MonadResource m, MonadBaseControl IO m)
     => ByteString -- ^ Action
-    -> SecurityGroupParam
+    -> SecurityGroupRequest
     -> [IpPermission]
     -> EC2 m Bool
 securityGroupQuery act param ipps =
diff --git a/AWS/EC2/Types.hs b/AWS/EC2/Types.hs
--- a/AWS/EC2/Types.hs
+++ b/AWS/EC2/Types.hs
@@ -2,6 +2,7 @@
 
 import Data.Default (Default(..))
 import Data.Text (Text)
+import Data.ByteString (ByteString)
 import Data.Time (UTCTime)
 
 import AWS.Util
@@ -31,13 +32,13 @@
     , imageTagSet :: [ResourceTag]
     , imageHypervisor :: Hypervisor
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data ImageState
     = ImageAvailable
     | ImagePending
     | ImageFailed
-  deriving (Show)
+  deriving (Show, Eq)
 
 imageState :: Text -> ImageState
 imageState a
@@ -50,11 +51,11 @@
     { pcCode :: Text
     , pcType :: ProductCodeType
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data ProductCodeType = Devpay
                      | Marketplace
-  deriving (Show)
+  deriving (Show, Eq)
 
 productCodeType :: Text -> ProductCodeType
 productCodeType t
@@ -65,7 +66,7 @@
 data ImageType = Machine
                | Kernel
                | RamDisk
-  deriving (Show)
+  deriving (Show, Eq)
 
 imageType :: Text -> ImageType
 imageType t
@@ -76,7 +77,7 @@
 
 data Platform = Windows
               | Other
-  deriving (Show)
+  deriving (Show, Eq)
 
 platform :: Maybe Text -> Platform
 platform Nothing   = Other
@@ -88,12 +89,12 @@
     { stateReasonCode :: Text
     , stateReasonMessage :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data RootDeviceType
     = EBS
     | InstanceStore
-  deriving (Show)
+  deriving (Show, Eq)
 
 rootDeviceType :: Text -> RootDeviceType
 rootDeviceType t
@@ -106,7 +107,7 @@
     , virtualName :: Maybe Text
     , ebs :: Maybe EbsBlockDevice
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data EbsBlockDevice = EbsBlockDevice
     { ebsSnapshotId :: Maybe Text
@@ -114,11 +115,11 @@
     , ebsDeleteOnTermination :: Bool
     , ebsVolumeType :: VolumeType
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VolumeType = Standard
                 | IO1 Int
-  deriving (Show)
+  deriving (Show, Eq)
 
 volumeType :: Text -> Maybe Int -> VolumeType
 volumeType t Nothing  | t == "standard" = Standard
@@ -131,7 +132,7 @@
 
 data VirtualizationType = Paravirtual
                         | HVM
-  deriving (Show)
+  deriving (Show, Eq)
 
 virtualizationType :: Text -> VirtualizationType
 virtualizationType t
@@ -143,11 +144,11 @@
     { resourceKey :: Text
     , resourceValue :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Hypervisor = OVM
                 | Xen
-  deriving (Show)
+  deriving (Show, Eq)
 
 hypervisor :: Text -> Hypervisor
 hypervisor t
@@ -160,7 +161,7 @@
     { regionName :: Text
     , regionEndpoint :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data AvailabilityZone = AvailabilityZone
     { zoneName :: Text
@@ -168,7 +169,7 @@
     , zoneRegionName :: Text
     , messageSet :: [AvailabilityZoneMessage]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 type AvailabilityZoneMessage = Text
 
@@ -179,7 +180,7 @@
     , instanceSet :: [Instance]
     , requesterId :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Instance = Instance
     { instanceId :: Text
@@ -219,7 +220,7 @@
     , instanceIamInstanceProfile :: Maybe IamInstanceProfile
     , ebsOptimized :: Bool -- default: false
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceStatus = InstanceStatus
     { isInstanceId :: Text
@@ -229,7 +230,7 @@
     , isSystemStatus :: InstanceStatusType
     , isInstanceStatus :: InstanceStatusType
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceStatusEvent = InstanceStatusEvent
     { iseCode :: InstanceStatusEventCode
@@ -237,14 +238,14 @@
     , iseNotBefore :: Maybe UTCTime
     , iseNotAfter :: Maybe UTCTime
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceStatusEventCode
     = InstanceReboot
     | InstanceStop
     | SystemReboot
     | InstanceRetirement
-  deriving (Show)
+  deriving (Show, Eq)
 
 instanceStatusEventCode :: Text -> InstanceStatusEventCode
 instanceStatusEventCode t
@@ -258,14 +259,14 @@
     { isdStatus :: InstanceStatusTypeStatus
     , isdDetails :: [InstanceStatusDetail]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceStatusTypeStatus
     = InstanceStatusOK
     | InstanceStatusImpaired
     | InstanceStatusInsufficientData
     | InstanceStatusNotApplicable
-  deriving (Show)
+  deriving (Show, Eq)
 
 instanceStatusTypeStatus :: Text -> InstanceStatusTypeStatus
 instanceStatusTypeStatus t
@@ -280,7 +281,7 @@
     , isddStatus :: InstanceStatusDetailStatus
     , isddImpairedSince :: Maybe UTCTime
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 type InstanceStatusDetailName = Text
 
@@ -290,7 +291,7 @@
     { groupId :: Text
     , groupName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceState
     = Pending
@@ -300,7 +301,7 @@
     | Stopping
     | Stopped
     | UnknownState Int
-  deriving (Show)
+  deriving (Show, Eq)
 
 instanceStateCodes :: [(Int, InstanceState)]
 instanceStateCodes =
@@ -322,13 +323,13 @@
     , placementGroupName :: Text
     , tenancy :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceMonitoringState
     = MonitoringDisabled
     | MonitoringEnabled
     | MonitoringPending
-  deriving (Show)
+  deriving (Show, Eq)
 
 instanceMonitoringState :: Text -> InstanceMonitoringState
 instanceMonitoringState t
@@ -337,7 +338,7 @@
     | t == "pending"  = MonitoringPending
     | otherwise       = err "monitoring state" t
 
-data Architecture = I386 | X86_64 deriving (Show)
+data Architecture = I386 | X86_64 deriving (Show, Eq)
 
 architecture :: Text -> Architecture
 architecture t
@@ -349,7 +350,7 @@
     { instanceDeviceName :: Text
     , instanceEbs :: InstanceEbsBlockDevice
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceEbsBlockDevice = InstanceEbsBlockDevice
     { instanceEbsVolumeId :: Text
@@ -357,10 +358,10 @@
     , instanceEbsAttachTime :: UTCTime
     , instanceEbsDeleteOnTermination :: Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceLifecycle = LifecycleSpot | LifecycleNone
-  deriving (Show)
+  deriving (Show, Eq)
 
 instanceLifecycle :: Maybe Text -> InstanceLifecycle
 instanceLifecycle Nothing = LifecycleNone
@@ -383,7 +384,7 @@
     , iniAssociation :: Maybe NetworkInterfaceAssociation
     , iniPrivateIpAddressSet :: [InstancePrivateIpAddress]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data NetworkInterfaceAttachment = NetworkInterfaceAttachment
     { niatAttachmentId :: Text
@@ -392,31 +393,31 @@
     , niatAttachTime :: UTCTime
     , niatDeleteOnTermination :: Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data NetworkInterfaceAssociation = NetworkInterfaceAssociation
     { niasPublicIp :: Text
     , niasIpOwnerId :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstancePrivateIpAddress = InstancePrivateIpAddress
     { iPrivateIpAddress :: Text
     , iPrimary :: Bool
     , iAssociation :: Maybe NetworkInterfaceAssociation
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data IamInstanceProfile = IamInstanceProfile
     { iipArn :: Text
     , iipId :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data ShutdownBehavior
     = SBStop
     | SBTerminate
-  deriving (Show)
+  deriving (Show, Eq)
 
 shutdownBehavior :: Text -> ShutdownBehavior
 shutdownBehavior t
@@ -437,7 +438,7 @@
     | IAGroupSet [Text]
     | IAProductCodes [ProductCode]
     | IAEbsOptimized Bool
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Address = Address
     { addrPublicIp :: Text
@@ -449,10 +450,10 @@
     , addrNetworkInterfaceOwnerId :: Maybe Text
     , addrPrivateIpAddress :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data AddressDomain = AddressDomainStandard | AddressDomainVPC
-  deriving (Show)
+  deriving (Show, Eq)
 
 addressDomain :: Maybe Text -> AddressDomain
 addressDomain Nothing = AddressDomainStandard
@@ -466,10 +467,10 @@
     , alaDomain :: AddressDomain
     , alaAllocationId :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data EC2Return = EC2Success | EC2Error Text
-  deriving (Show)
+  deriving (Show, Eq)
 
 ec2Return :: Text -> EC2Return
 ec2Return t
@@ -482,28 +483,28 @@
     , tagKey :: Text
     , tagValue :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data InstanceStateChange = InstanceStateChange
     { iscInstanceId :: Text
     , iscCurrentState :: InstanceState
     , iscPreviousState :: InstanceState
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data ConsoleOutput = ConsoleOutput
     { coInstanceId :: Text
     , coTimestamp :: UTCTime -- ^ The time the data was last updated.
     , coOutput :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data PasswordData = PasswordData
     { pdInstanceId :: Text
     , pdTimestamp :: UTCTime -- ^ The time the data was last updated.
     , pdPasswordData :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Snapshot = Snapshot
     { snapshotId :: Text
@@ -517,10 +518,10 @@
     , ssOwnerAlias :: Maybe Text
     , ssTagSet :: [ResourceTag]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data SnapshotStatus = SSPending | SSCompleted | SSError
-  deriving (Show)
+  deriving (Show, Eq)
 
 snapshotStatus :: Text -> SnapshotStatus
 snapshotStatus t
@@ -540,7 +541,7 @@
     , volTagSet :: [ResourceTag]
     , volVolumeType :: VolumeType
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VolumeStatus
     = VolCreating
@@ -549,7 +550,7 @@
     | VolDeleting
     | VolDeleted
     | VolError
-  deriving (Show)
+  deriving (Show, Eq)
 
 volumeStatus :: Text -> VolumeStatus
 volumeStatus t
@@ -569,14 +570,14 @@
     , attAttachTime :: UTCTime
     , attDeleteOnTermination :: Maybe Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data AttachmentStatus
     = AttAttaching
     | AttAttached
     | AttDetaching
     | AttDetached
-  deriving (Show)
+  deriving (Show, Eq)
 
 attachmentStatus :: Text -> AttachmentStatus
 attachmentStatus t
@@ -590,7 +591,7 @@
     { keyName :: Text
     , keyFingerprint :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data SecurityGroup = SecurityGroup
     { sgOwnerId :: Text
@@ -602,7 +603,7 @@
     , sgIpPermissionsEgress :: [IpPermission]
     , sgTagSet :: [ResourceTag]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data IpPermission = IpPermission
     { ippIpProtocol :: Text
@@ -611,19 +612,19 @@
     , ippGroups :: [UserIdGroupPair]
     , ippIpRanges :: [IpRange]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data UserIdGroupPair = UserIdGroupPair
     { uigpUserId :: Maybe Text
     , uigpGroupId :: Text
     , uigpGroupName :: Maybe Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data IpRange = IpRange
     { iprCidrIp :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data BlockDeviceMappingParam
     = BlockDeviceMappingParamEBS
@@ -638,12 +639,12 @@
         , bdmpIsNoDevice :: Maybe Bool
         , bdmpIsVirtualName :: Maybe Text
         }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data EbsSource
     = EbsSnapshotId Text
     | EbsVolumeSize Int
-  deriving (Show)
+  deriving (Show, Eq)
 
 data NetworkInterfaceParam = NetworkInterfaceParam
     { nipInterfaceId :: Maybe Text
@@ -654,7 +655,7 @@
     , nipSecurityGroupIds :: [Text]
     , nipDeleteOnTermination :: Maybe Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VpnConnection = VpnConnection
     { vpnConnectionId :: Text
@@ -668,14 +669,14 @@
     , vcOptions :: Maybe VpnConnectionOptionsRequest
     , vcRoutes :: Maybe VpnStaticRoute
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VpnConnectionState
     = VCSPending
     | VCSAvailable
     | VCSDeleting
     | VCSDeleted
-  deriving (Show)
+  deriving (Show, Eq)
 
 vpnConnectionState :: Text -> VpnConnectionState
 vpnConnectionState t
@@ -692,12 +693,12 @@
     , vttStatusMessage :: Text
     , vttAcceptRouteCount :: Int
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VpnTunnelTelemetryStatus
     = VTTSUp
     | VTTSDown
-  deriving (Show)
+  deriving (Show, Eq)
 
 vpnTunnelTelemetryStatus :: Text -> VpnTunnelTelemetryStatus
 vpnTunnelTelemetryStatus t
@@ -708,17 +709,17 @@
 data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest
     { staticRoutesOnly :: Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VpnStaticRoute = VpnStaticRoute
     { vsrDestinationCidrBlock :: Text
     , vsrSource :: VpnStaticRouteSource
     , vsrState :: VpnStaticRouteState
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data VpnStaticRouteSource = VSRStatic
-  deriving (Show)
+  deriving (Show, Eq)
 
 vpnStaticRouteSource :: Text -> VpnStaticRouteSource
 vpnStaticRouteSource t
@@ -730,7 +731,7 @@
     | VSRSAvailable
     | VSRSDeleting
     | VSRSDeleted
-  deriving (Show)
+  deriving (Show, Eq)
 
 vpnStaticRouteState :: Text -> VpnStaticRouteState
 vpnStaticRouteState t
@@ -739,3 +740,116 @@
     | t == "deleting"  = VSRSDeleting
     | t == "deleted"   = VSRSDeleted
     | otherwise        = err "vpn static route state" t
+
+data RunInstancesRequest = RunInstancesRequest
+    { riImageId :: Text -- ^ Required
+    , riMinCount :: Int -- ^ Required
+    , riMaxCount :: Int -- ^ Required
+    , riKeyName :: Maybe Text
+    , riSecurityGroupIds :: [Text]
+      -- ^ SecurityGroupIds (Required for VPC; optional for EC2)
+    , riSecurityGroups :: [Text]
+      -- ^ SecurityGroups (Only for EC2; either id or name is accepted)
+    , riUserData :: Maybe ByteString
+      -- ^ UserData (Base64-encoded MIME user data)
+    , riInstanceType :: Maybe Text
+    , riAvailabilityZone :: Maybe Text
+    , riPlacementGroup :: Maybe Text
+    , riTenancy :: Maybe Text
+    , riKernelId :: Maybe Text
+    , riRamdiskId :: Maybe Text
+    , riBlockDeviceMappings :: [BlockDeviceMappingParam]
+    , riMonitoringEnabled :: Maybe Bool
+    , riSubnetId :: Maybe Text
+    , riDisableApiTermination :: Maybe Bool
+    , riShutdownBehavior :: Maybe ShutdownBehavior
+    , riPrivateIpAddresses :: [Text] -- ^ XXX: not implemented
+    , riClientToken :: Maybe Text
+    , riNetworkInterface :: [NetworkInterfaceParam] -- ^ XXX: not implemented
+    , riIamInstanceProfile :: Maybe IamInstanceProfile
+    , riEbsOptimized :: Maybe Bool
+    }
+  deriving (Show, Eq)
+
+data InstanceAttributeRequest
+    = IARInstanceType
+    | IARKernelId
+    | IARRamdiskId
+    | IARUserData
+    | IARDisableApiTermination
+    | IARShutdownBehavior
+    | IARRootDeviceName
+    | IARBlockDeviceMapping
+    | IARSourceDestCheck
+    | IARGroupSet
+    | IARProductCodes
+    | IAREbsOptimized
+  deriving (Show, Eq, Ord)
+
+data ResetInstanceAttributeRequest
+    = RIAPKernel
+    | RIAPRamdisk
+    | RIAPSourceDestCheck
+  deriving (Show, Eq)
+
+data ModifyInstanceAttributeRequest
+    = MIAPInstanceType Text
+    | MIAPKernelId Text
+    | MIAPRamdiskId Text
+    | MIAPUserData Text
+    | MIAPDisableApiTermination Bool
+    | MIAPShutdownBehavior ShutdownBehavior
+    | MIAPRootDeviceName Text
+    | MIAPBlockDeviceMapping [BlockDeviceMappingParam]
+    | MIAPSourceDestCheck Bool
+    | MIAPGroupSet [Text]
+    | MIAPEbsOptimized Bool
+  deriving (Show, Eq)
+
+data RegisterImageRequest = RegisterImageRequest
+    { rirName :: Text
+    , rirImageLocation :: Maybe Text
+    , rirDescription :: Maybe Text
+    , rirArchitecture :: Maybe Text
+    , rirKernelId :: Maybe Text
+    , rirRamdiskId :: Maybe Text
+    , rirRootDeviceName :: Maybe Text
+    , rirBlockDeviceMappings :: [BlockDeviceMappingParam]
+    }
+  deriving (Show, Eq)
+
+data CreateVolumeRequest
+    = CreateNewVolume
+        { cnvSize :: Int
+        , cnvAvailabilityZone :: Text
+        , cnvVolumeType :: Maybe VolumeType
+        }
+    | CreateFromSnapshot
+        { cfsSnapshotId :: Text
+        , cfsAvailabilityZone :: Text
+        , cfsSize :: Maybe Int
+        , cfsVolumeType :: Maybe VolumeType
+        }
+  deriving (Show, Eq)
+
+data AssociateAddressRequest
+    = AAEC2Instance
+        { aaec2PublicIp :: Text
+        , aaec2InstanceId :: Text
+        }
+    | AAVPCInstance
+        { aavpcAllocationId :: Text
+        , aavpcInstanceId :: Maybe Text
+        , aavpcNetworkInterfaceId :: Maybe Text
+        , aavpcPrivateIpAddress :: Maybe Text
+        , aavpcAllowReassociation :: Maybe Bool
+        }
+  deriving (Show, Eq)
+
+data DisassociateAddressRequest
+    = DAEC2 Text -- ^ PublicIp for EC2
+    | DAVPC Text -- ^ AssociationId for VPC
+  deriving (Show, Eq)
+
+data SecurityGroupRequest = GroupId Text | GroupName Text
+  deriving (Show, Eq)
diff --git a/AWS/EC2/Volume.hs b/AWS/EC2/Volume.hs
--- a/AWS/EC2/Volume.hs
+++ b/AWS/EC2/Volume.hs
@@ -2,7 +2,6 @@
 module AWS.EC2.Volume
     ( describeVolumes
     , createVolume
-    , CreateVolumeParam(..)
     , deleteVolume
     , attachVolume
     , detachVolume
@@ -65,28 +64,14 @@
 
 createVolume
     :: (MonadResource m, MonadBaseControl IO m)
-    => CreateVolumeParam
+    => CreateVolumeRequest
     -> EC2 m Volume
 createVolume param =
     ec2Query "CreateVolume" param' volumeSink
   where
     param' = createVolumeParam param
 
-data CreateVolumeParam
-    = CreateNewVolume
-        { cnvSize :: Int
-        , cnvAvailabilityZone :: Text
-        , cnvVolumeType :: Maybe VolumeType
-        }
-    | CreateFromSnapshot
-        { cfsSnapshotId :: Text
-        , cfsAvailabilityZone :: Text
-        , cfsSize :: Maybe Int
-        , cfsVolumeType :: Maybe VolumeType
-        }
-  deriving (Show)
-
-createVolumeParam :: CreateVolumeParam -> [QueryParam]
+createVolumeParam :: CreateVolumeRequest -> [QueryParam]
 createVolumeParam (CreateNewVolume size zone vtype) =
     [ ValueParam "Size" $ toText size
     , ValueParam "AvailabilityZone" zone
diff --git a/AWS/ELB/Types.hs b/AWS/ELB/Types.hs
--- a/AWS/ELB/Types.hs
+++ b/AWS/ELB/Types.hs
@@ -22,13 +22,13 @@
     , lbBackendServerDescriptions :: [BackendServerDescription]
     , lbSubnets :: [Text]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data BackendServerDescription = BackendServerDescription
     { bsInstancePort :: Int
     , bsPolicyNames :: [Text]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data HealthCheck = HealthCheck
     { hcInterval :: Int
@@ -37,18 +37,18 @@
     , hcTimeout :: Int
     , hcUnhealthyThreshold :: Int
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Instance = Instance
     { iInstanceId :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data ListenerDescription = ListenerDescription
     { ldPolicyNames :: [Text]
     , ldListener :: Listener
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Listener = Listener
     { lProtocol :: Text
@@ -57,29 +57,29 @@
     , lSSLCertificateId :: Maybe Text
     , lInstancePort :: Int
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Policies = Policies
     { pAppCookieStickinessPolicies :: [AppCookieStickinessPolicy]
     , pOtherPolicies :: [Text]
     , pLBCookieStickinessPolicies :: [LBCookieStickinessPolicy]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data AppCookieStickinessPolicy = AppCookieStickinessPolicy
     { acspCookieName :: Text
     , acspPolicyName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data LBCookieStickinessPolicy = LBCookieStickinessPolicy
     { lbcspCookieExpirationPeriod :: Integer
     , lbcspPolicyName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data SourceSecurityGroup = SourceSecurityGroup
     { ssgOwnerAlias :: Text
     , ssgGroupName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
diff --git a/AWS/RDS/Types.hs b/AWS/RDS/Types.hs
--- a/AWS/RDS/Types.hs
+++ b/AWS/RDS/Types.hs
@@ -33,19 +33,19 @@
     , dbiDBInstanceClass :: Text
     , dbiMasterUsername :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data DBParameterGroupStatus = DBParameterGroupStatus
     { dbpgsParameterApplyStatus :: Text
     , dbpgsDBParameterGroupName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data DBSecurityGroupMembership = DBSecurityGroupMembership
     { dbsgmStatus :: Text
     , dbsgmDBSecurityGroupName :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data DBSubnetGroup = DBSubnetGroup
     { dbsngVpcId :: Text
@@ -54,32 +54,32 @@
     , dbsngDBSubnetGroupName :: Text
     , dbsngSubnets :: [Subnet]
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Subnet = Subnet
     { subnetStatus :: Text
     , subnetIdentifier :: Text
     , subnetAvailabilityZone :: AvailabilityZone
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data AvailabilityZone = AvailabilityZone
     { azName :: Text
     , azProvisionedIopsCapable :: Bool
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data Endpoint = Endpoint
     { epPort :: Int
     , epAddress :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data OptionGroupMembership = OptionGroupMembership
     { ogmOptionGroupName :: Text
     , ogmStatus :: Text
     }
-  deriving (Show)
+  deriving (Show, Eq)
 
 data PendingModifiedValue
     = PMVAllocatedStorage Int
@@ -90,4 +90,4 @@
     | PMVMasterUserPassword Text
     | PMVMultiAZ Bool
     | PMVPort Int
-  deriving (Show)
+  deriving (Show, Eq)
diff --git a/aws-sdk.cabal b/aws-sdk.cabal
--- a/aws-sdk.cabal
+++ b/aws-sdk.cabal
@@ -1,5 +1,5 @@
 name:                aws-sdk
-version:             0.4.1.0
+version:             0.4.2.0
 synopsis:            AWS SDK for Haskell
 description:         An AWS(Amazon Web Services) liblary for Haskell.
 license:             BSD3
