diff --git a/amazonka-route53.cabal b/amazonka-route53.cabal
--- a/amazonka-route53.cabal
+++ b/amazonka-route53.cabal
@@ -1,5 +1,5 @@
 name:                  amazonka-route53
-version:               0.0.0
+version:               0.0.1
 synopsis:              Amazon Route 53 SDK.
 homepage:              https://github.com/brendanhay/amazonka
 license:               OtherLicense
@@ -67,7 +67,8 @@
         , Network.AWS.Route53.UpdateHealthCheck
 
     other-modules:
+          Network.AWS.Route53.Internal
 
     build-depends:
-          amazonka-core
-        , base          >= 4.7 && < 5
+          amazonka-core == 0.0.1.*
+        , base          >= 4.7     && < 5
diff --git a/gen/Network/AWS/Route53/ChangeTagsForResource.hs b/gen/Network/AWS/Route53/ChangeTagsForResource.hs
--- a/gen/Network/AWS/Route53/ChangeTagsForResource.hs
+++ b/gen/Network/AWS/Route53/ChangeTagsForResource.hs
@@ -50,7 +50,7 @@
     { _ctfrAddTags       :: List1 "Tag" Tag
     , _ctfrRemoveTagKeys :: List1 "Key" Text
     , _ctfrResourceId    :: Text
-    , _ctfrResourceType  :: Text
+    , _ctfrResourceType  :: TagResourceType
     } deriving (Eq, Show)
 
 -- | 'ChangeTagsForResource' constructor.
@@ -63,9 +63,9 @@
 --
 -- * 'ctfrResourceId' @::@ 'Text'
 --
--- * 'ctfrResourceType' @::@ 'Text'
+-- * 'ctfrResourceType' @::@ 'TagResourceType'
 --
-changeTagsForResource :: Text -- ^ 'ctfrResourceType'
+changeTagsForResource :: TagResourceType -- ^ 'ctfrResourceType'
                       -> Text -- ^ 'ctfrResourceId'
                       -> NonEmpty Tag -- ^ 'ctfrAddTags'
                       -> NonEmpty Text -- ^ 'ctfrRemoveTagKeys'
@@ -95,7 +95,7 @@
 
 -- | The type of the resource. The resource type for health checks is
 -- healthcheck.
-ctfrResourceType :: Lens' ChangeTagsForResource Text
+ctfrResourceType :: Lens' ChangeTagsForResource TagResourceType
 ctfrResourceType = lens _ctfrResourceType (\s a -> s { _ctfrResourceType = a })
 
 data ChangeTagsForResourceResponse = ChangeTagsForResourceResponse
diff --git a/gen/Network/AWS/Route53/ListResourceRecordSets.hs b/gen/Network/AWS/Route53/ListResourceRecordSets.hs
--- a/gen/Network/AWS/Route53/ListResourceRecordSets.hs
+++ b/gen/Network/AWS/Route53/ListResourceRecordSets.hs
@@ -90,8 +90,8 @@
     , _lrrsMaxItems              :: Maybe Text
     , _lrrsStartRecordIdentifier :: Maybe Text
     , _lrrsStartRecordName       :: Maybe Text
-    , _lrrsStartRecordType       :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    , _lrrsStartRecordType       :: Maybe RecordType
+    } deriving (Eq, Show)
 
 -- | 'ListResourceRecordSets' constructor.
 --
@@ -105,7 +105,7 @@
 --
 -- * 'lrrsStartRecordName' @::@ 'Maybe' 'Text'
 --
--- * 'lrrsStartRecordType' @::@ 'Maybe' 'Text'
+-- * 'lrrsStartRecordType' @::@ 'Maybe' 'RecordType'
 --
 listResourceRecordSets :: Text -- ^ 'lrrsHostedZoneId'
                        -> ListResourceRecordSets
@@ -148,7 +148,7 @@
 -- Regional Resource Record Sets: A | AAAA | CNAME | TXT Values for Alias
 -- Resource Record Sets: A | AAAA Constraint: Specifying type without
 -- specifying name returns an InvalidInput error.
-lrrsStartRecordType :: Lens' ListResourceRecordSets (Maybe Text)
+lrrsStartRecordType :: Lens' ListResourceRecordSets (Maybe RecordType)
 lrrsStartRecordType =
     lens _lrrsStartRecordType (\s a -> s { _lrrsStartRecordType = a })
 
@@ -157,7 +157,7 @@
     , _lrrsrMaxItems             :: Text
     , _lrrsrNextRecordIdentifier :: Maybe Text
     , _lrrsrNextRecordName       :: Maybe Text
-    , _lrrsrNextRecordType       :: Maybe Text
+    , _lrrsrNextRecordType       :: Maybe RecordType
     , _lrrsrResourceRecordSets   :: List "ResourceRecordSet" ResourceRecordSet
     } deriving (Eq, Show)
 
@@ -173,7 +173,7 @@
 --
 -- * 'lrrsrNextRecordName' @::@ 'Maybe' 'Text'
 --
--- * 'lrrsrNextRecordType' @::@ 'Maybe' 'Text'
+-- * 'lrrsrNextRecordType' @::@ 'Maybe' 'RecordType'
 --
 -- * 'lrrsrResourceRecordSets' @::@ ['ResourceRecordSet']
 --
@@ -220,7 +220,7 @@
 -- | If the results were truncated, the type of the next record in the list.
 -- This element is present only if
 -- ListResourceRecordSetsResponse$IsTruncated is true.
-lrrsrNextRecordType :: Lens' ListResourceRecordSetsResponse (Maybe Text)
+lrrsrNextRecordType :: Lens' ListResourceRecordSetsResponse (Maybe RecordType)
 lrrsrNextRecordType =
     lens _lrrsrNextRecordType (\s a -> s { _lrrsrNextRecordType = a })
 
diff --git a/gen/Network/AWS/Route53/ListTagsForResource.hs b/gen/Network/AWS/Route53/ListTagsForResource.hs
--- a/gen/Network/AWS/Route53/ListTagsForResource.hs
+++ b/gen/Network/AWS/Route53/ListTagsForResource.hs
@@ -48,8 +48,8 @@
 
 data ListTagsForResource = ListTagsForResource
     { _ltfrResourceId   :: Text
-    , _ltfrResourceType :: Text
-    } deriving (Eq, Ord, Show)
+    , _ltfrResourceType :: TagResourceType
+    } deriving (Eq, Show)
 
 -- | 'ListTagsForResource' constructor.
 --
@@ -57,9 +57,9 @@
 --
 -- * 'ltfrResourceId' @::@ 'Text'
 --
--- * 'ltfrResourceType' @::@ 'Text'
+-- * 'ltfrResourceType' @::@ 'TagResourceType'
 --
-listTagsForResource :: Text -- ^ 'ltfrResourceType'
+listTagsForResource :: TagResourceType -- ^ 'ltfrResourceType'
                     -> Text -- ^ 'ltfrResourceId'
                     -> ListTagsForResource
 listTagsForResource p1 p2 = ListTagsForResource
@@ -73,7 +73,7 @@
 
 -- | The type of the resource. The resource type for health checks is
 -- healthcheck.
-ltfrResourceType :: Lens' ListTagsForResource Text
+ltfrResourceType :: Lens' ListTagsForResource TagResourceType
 ltfrResourceType = lens _ltfrResourceType (\s a -> s { _ltfrResourceType = a })
 
 newtype ListTagsForResourceResponse = ListTagsForResourceResponse
diff --git a/gen/Network/AWS/Route53/ListTagsForResources.hs b/gen/Network/AWS/Route53/ListTagsForResources.hs
--- a/gen/Network/AWS/Route53/ListTagsForResources.hs
+++ b/gen/Network/AWS/Route53/ListTagsForResources.hs
@@ -48,8 +48,8 @@
 
 data ListTagsForResources = ListTagsForResources
     { _ltfr1ResourceIds  :: List1 "ResourceId" Text
-    , _ltfr1ResourceType :: Text
-    } deriving (Eq, Ord, Show)
+    , _ltfr1ResourceType :: TagResourceType
+    } deriving (Eq, Show)
 
 -- | 'ListTagsForResources' constructor.
 --
@@ -57,9 +57,9 @@
 --
 -- * 'ltfr1ResourceIds' @::@ 'NonEmpty' 'Text'
 --
--- * 'ltfr1ResourceType' @::@ 'Text'
+-- * 'ltfr1ResourceType' @::@ 'TagResourceType'
 --
-listTagsForResources :: Text -- ^ 'ltfr1ResourceType'
+listTagsForResources :: TagResourceType -- ^ 'ltfr1ResourceType'
                      -> NonEmpty Text -- ^ 'ltfr1ResourceIds'
                      -> ListTagsForResources
 listTagsForResources p1 p2 = ListTagsForResources
@@ -74,7 +74,7 @@
 
 -- | The type of the resources. The resource type for health checks is
 -- healthcheck.
-ltfr1ResourceType :: Lens' ListTagsForResources Text
+ltfr1ResourceType :: Lens' ListTagsForResources TagResourceType
 ltfr1ResourceType =
     lens _ltfr1ResourceType (\s a -> s { _ltfr1ResourceType = a })
 
diff --git a/gen/Network/AWS/Route53/Types.hs b/gen/Network/AWS/Route53/Types.hs
--- a/gen/Network/AWS/Route53/Types.hs
+++ b/gen/Network/AWS/Route53/Types.hs
@@ -92,8 +92,8 @@
     , cAction
     , cResourceRecordSet
 
-    -- * ResourceRecordSetFailover
-    , ResourceRecordSetFailover (..)
+    -- * Failover
+    , Failover (..)
 
     -- * HostedZone
     , HostedZone
@@ -183,11 +183,15 @@
     , healthCheckObservation
     , hcoIPAddress
     , hcoStatusReport
+
+    -- * Common
+    , module Network.AWS.Route53.Internal
     ) where
 
 import Network.AWS.Error
 import Network.AWS.Prelude
 import Network.AWS.Signing.V3
+import Network.AWS.Route53.Internal
 import qualified GHC.Exts
 
 -- | Version @2013-04-01@ of the Amazon Route 53 service.
@@ -534,6 +538,10 @@
         UsWest1      -> "us-west-1"
         UsWest2      -> "us-west-2"
 
+instance ToByteString VPCRegion
+instance ToHeader     VPCRegion
+instance ToQuery      VPCRegion
+
 instance FromXML VPCRegion where
     parseXML = parseXMLText "VPCRegion"
 
@@ -559,6 +567,10 @@
         Delete' -> "DELETE"
         Upsert  -> "UPSERT"
 
+instance ToByteString ChangeAction
+instance ToHeader     ChangeAction
+instance ToQuery      ChangeAction
+
 instance FromXML ChangeAction where
     parseXML = parseXMLText "ChangeAction"
 
@@ -577,6 +589,10 @@
 instance ToText TagResourceType where
     toText Healthcheck = "healthcheck"
 
+instance ToByteString TagResourceType
+instance ToHeader     TagResourceType
+instance ToQuery      TagResourceType
+
 instance FromXML TagResourceType where
     parseXML = parseXMLText "TagResourceType"
 
@@ -591,8 +607,8 @@
     , _hccRequestInterval          :: Maybe Nat
     , _hccResourcePath             :: Maybe Text
     , _hccSearchString             :: Maybe Text
-    , _hccType                     :: Text
-    } deriving (Eq, Ord, Show)
+    , _hccType                     :: HealthCheckType
+    } deriving (Eq, Show)
 
 -- | 'HealthCheckConfig' constructor.
 --
@@ -612,9 +628,9 @@
 --
 -- * 'hccSearchString' @::@ 'Maybe' 'Text'
 --
--- * 'hccType' @::@ 'Text'
+-- * 'hccType' @::@ 'HealthCheckType'
 --
-healthCheckConfig :: Text -- ^ 'hccType'
+healthCheckConfig :: HealthCheckType -- ^ 'hccType'
                   -> HealthCheckConfig
 healthCheckConfig p1 = HealthCheckConfig
     { _hccType                     = p1
@@ -676,7 +692,7 @@
 
 -- | The type of health check to be performed. Currently supported types are
 -- TCP, HTTP, HTTPS, HTTP_STR_MATCH, and HTTPS_STR_MATCH.
-hccType :: Lens' HealthCheckConfig Text
+hccType :: Lens' HealthCheckConfig HealthCheckType
 hccType = lens _hccType (\s a -> s { _hccType = a })
 
 instance FromXML HealthCheckConfig where
@@ -703,7 +719,7 @@
         ]
 
 data Change = Change
-    { _cAction            :: Text
+    { _cAction            :: ChangeAction
     , _cResourceRecordSet :: ResourceRecordSet
     } deriving (Eq, Show)
 
@@ -711,11 +727,11 @@
 --
 -- The fields accessible through corresponding lenses are:
 --
--- * 'cAction' @::@ 'Text'
+-- * 'cAction' @::@ 'ChangeAction'
 --
 -- * 'cResourceRecordSet' @::@ 'ResourceRecordSet'
 --
-change :: Text -- ^ 'cAction'
+change :: ChangeAction -- ^ 'cAction'
        -> ResourceRecordSet -- ^ 'cResourceRecordSet'
        -> Change
 change p1 p2 = Change
@@ -724,7 +740,7 @@
     }
 
 -- | The action to perform. Valid values: CREATE | DELETE | UPSERT.
-cAction :: Lens' Change Text
+cAction :: Lens' Change ChangeAction
 cAction = lens _cAction (\s a -> s { _cAction = a })
 
 -- | Information about the resource record set to create or delete.
@@ -743,26 +759,30 @@
         , "ResourceRecordSet" =@ _cResourceRecordSet
         ]
 
-data ResourceRecordSetFailover
+data Failover
     = Primary   -- ^ PRIMARY
     | Secondary -- ^ SECONDARY
       deriving (Eq, Ord, Show, Generic, Enum)
 
-instance Hashable ResourceRecordSetFailover
+instance Hashable Failover
 
-instance FromText ResourceRecordSetFailover where
+instance FromText Failover where
     parser = match "PRIMARY"   Primary
          <|> match "SECONDARY" Secondary
 
-instance ToText ResourceRecordSetFailover where
+instance ToText Failover where
     toText = \case
         Primary   -> "PRIMARY"
         Secondary -> "SECONDARY"
 
-instance FromXML ResourceRecordSetFailover where
-    parseXML = parseXMLText "ResourceRecordSetFailover"
+instance ToByteString Failover
+instance ToHeader     Failover
+instance ToQuery      Failover
 
-instance ToXML ResourceRecordSetFailover where
+instance FromXML Failover where
+    parseXML = parseXMLText "Failover"
+
+instance ToXML Failover where
     toXML = toXMLText
 
 data HostedZone = HostedZone
@@ -848,7 +868,7 @@
 
 data ResourceTagSet = ResourceTagSet
     { _rtsResourceId   :: Maybe Text
-    , _rtsResourceType :: Maybe Text
+    , _rtsResourceType :: Maybe TagResourceType
     , _rtsTags         :: List1 "Tag" Tag
     } deriving (Eq, Show)
 
@@ -858,7 +878,7 @@
 --
 -- * 'rtsResourceId' @::@ 'Maybe' 'Text'
 --
--- * 'rtsResourceType' @::@ 'Maybe' 'Text'
+-- * 'rtsResourceType' @::@ 'Maybe' 'TagResourceType'
 --
 -- * 'rtsTags' @::@ 'NonEmpty' 'Tag'
 --
@@ -876,7 +896,7 @@
 
 -- | The type of the resource. The resource type for health checks is
 -- healthcheck.
-rtsResourceType :: Lens' ResourceTagSet (Maybe Text)
+rtsResourceType :: Lens' ResourceTagSet (Maybe TagResourceType)
 rtsResourceType = lens _rtsResourceType (\s a -> s { _rtsResourceType = a })
 
 -- | The tags associated with the specified resource.
@@ -912,6 +932,10 @@
         Insync  -> "INSYNC"
         Pending -> "PENDING"
 
+instance ToByteString ChangeStatus
+instance ToHeader     ChangeStatus
+instance ToQuery      ChangeStatus
+
 instance FromXML ChangeStatus where
     parseXML = parseXMLText "ChangeStatus"
 
@@ -1025,6 +1049,10 @@
         HttpsStrMatch -> "HTTPS_STR_MATCH"
         Tcp           -> "TCP"
 
+instance ToByteString HealthCheckType
+instance ToHeader     HealthCheckType
+instance ToQuery      HealthCheckType
+
 instance FromXML HealthCheckType where
     parseXML = parseXMLText "HealthCheckType"
 
@@ -1033,8 +1061,8 @@
 
 data VPC = VPC
     { _vpcVPCId     :: Maybe Text
-    , _vpcVPCRegion :: Maybe Text
-    } deriving (Eq, Ord, Show)
+    , _vpcVPCRegion :: Maybe VPCRegion
+    } deriving (Eq, Show)
 
 -- | 'VPC' constructor.
 --
@@ -1042,7 +1070,7 @@
 --
 -- * 'vpcVPCId' @::@ 'Maybe' 'Text'
 --
--- * 'vpcVPCRegion' @::@ 'Maybe' 'Text'
+-- * 'vpcVPCRegion' @::@ 'Maybe' 'VPCRegion'
 --
 vpc :: VPC
 vpc = VPC
@@ -1053,7 +1081,7 @@
 vpcVPCId :: Lens' VPC (Maybe Text)
 vpcVPCId = lens _vpcVPCId (\s a -> s { _vpcVPCId = a })
 
-vpcVPCRegion :: Lens' VPC (Maybe Text)
+vpcVPCRegion :: Lens' VPC (Maybe VPCRegion)
 vpcVPCRegion = lens _vpcVPCRegion (\s a -> s { _vpcVPCRegion = a })
 
 instance FromXML VPC where
@@ -1112,15 +1140,15 @@
 
 data ResourceRecordSet = ResourceRecordSet
     { _rrsAliasTarget     :: Maybe AliasTarget
-    , _rrsFailover        :: Maybe Text
+    , _rrsFailover        :: Maybe Failover
     , _rrsGeoLocation     :: Maybe GeoLocation
     , _rrsHealthCheckId   :: Maybe Text
     , _rrsName            :: Text
-    , _rrsRegion          :: Maybe Text
+    , _rrsRegion          :: Maybe Region
     , _rrsResourceRecords :: List1 "ResourceRecord" ResourceRecord
     , _rrsSetIdentifier   :: Maybe Text
     , _rrsTTL             :: Maybe Nat
-    , _rrsType            :: Text
+    , _rrsType            :: RecordType
     , _rrsWeight          :: Maybe Nat
     } deriving (Eq, Show)
 
@@ -1130,7 +1158,7 @@
 --
 -- * 'rrsAliasTarget' @::@ 'Maybe' 'AliasTarget'
 --
--- * 'rrsFailover' @::@ 'Maybe' 'Text'
+-- * 'rrsFailover' @::@ 'Maybe' 'Failover'
 --
 -- * 'rrsGeoLocation' @::@ 'Maybe' 'GeoLocation'
 --
@@ -1138,7 +1166,7 @@
 --
 -- * 'rrsName' @::@ 'Text'
 --
--- * 'rrsRegion' @::@ 'Maybe' 'Text'
+-- * 'rrsRegion' @::@ 'Maybe' 'Region'
 --
 -- * 'rrsResourceRecords' @::@ 'NonEmpty' 'ResourceRecord'
 --
@@ -1146,12 +1174,12 @@
 --
 -- * 'rrsTTL' @::@ 'Maybe' 'Natural'
 --
--- * 'rrsType' @::@ 'Text'
+-- * 'rrsType' @::@ 'RecordType'
 --
 -- * 'rrsWeight' @::@ 'Maybe' 'Natural'
 --
 resourceRecordSet :: Text -- ^ 'rrsName'
-                  -> Text -- ^ 'rrsType'
+                  -> RecordType -- ^ 'rrsType'
                   -> NonEmpty ResourceRecord -- ^ 'rrsResourceRecords'
                   -> ResourceRecordSet
 resourceRecordSet p1 p2 p3 = ResourceRecordSet
@@ -1188,7 +1216,7 @@
 -- secondary is passing a health check or has no associated health check, or
 -- (2) there is no primary resource record set. Valid values: PRIMARY |
 -- SECONDARY.
-rrsFailover :: Lens' ResourceRecordSet (Maybe Text)
+rrsFailover :: Lens' ResourceRecordSet (Maybe Failover)
 rrsFailover = lens _rrsFailover (\s a -> s { _rrsFailover = a })
 
 -- | Geo location resource record sets only: Among resource record sets that
@@ -1210,7 +1238,7 @@
 -- | Latency-based resource record sets only: Among resource record sets that
 -- have the same combination of DNS name and type, a value that specifies
 -- the AWS region for the current resource record set.
-rrsRegion :: Lens' ResourceRecordSet (Maybe Text)
+rrsRegion :: Lens' ResourceRecordSet (Maybe Region)
 rrsRegion = lens _rrsRegion (\s a -> s { _rrsRegion = a })
 
 -- | A complex type that contains the resource records for the current
@@ -1231,7 +1259,7 @@
 rrsTTL = lens _rrsTTL (\s a -> s { _rrsTTL = a }) . mapping _Nat
 
 -- | The type of the current resource record set.
-rrsType :: Lens' ResourceRecordSet Text
+rrsType :: Lens' ResourceRecordSet RecordType
 rrsType = lens _rrsType (\s a -> s { _rrsType = a })
 
 -- | Weighted resource record sets only: Among resource record sets that have
@@ -1326,9 +1354,9 @@
 data ChangeInfo = ChangeInfo
     { _ciComment     :: Maybe Text
     , _ciId          :: Text
-    , _ciStatus      :: Text
+    , _ciStatus      :: ChangeStatus
     , _ciSubmittedAt :: RFC822
-    } deriving (Eq, Ord, Show)
+    } deriving (Eq, Show)
 
 -- | 'ChangeInfo' constructor.
 --
@@ -1338,12 +1366,12 @@
 --
 -- * 'ciId' @::@ 'Text'
 --
--- * 'ciStatus' @::@ 'Text'
+-- * 'ciStatus' @::@ 'ChangeStatus'
 --
 -- * 'ciSubmittedAt' @::@ 'UTCTime'
 --
 changeInfo :: Text -- ^ 'ciId'
-           -> Text -- ^ 'ciStatus'
+           -> ChangeStatus -- ^ 'ciStatus'
            -> UTCTime -- ^ 'ciSubmittedAt'
            -> ChangeInfo
 changeInfo p1 p2 p3 = ChangeInfo
@@ -1368,7 +1396,7 @@
 -- | The current state of the request. PENDING indicates that this request has
 -- not yet been applied to all Amazon Route 53 DNS servers. Valid Values:
 -- PENDING | INSYNC.
-ciStatus :: Lens' ChangeInfo Text
+ciStatus :: Lens' ChangeInfo ChangeStatus
 ciStatus = lens _ciStatus (\s a -> s { _ciStatus = a })
 
 -- | The date and time the change was submitted, in the format
diff --git a/src/Network/AWS/Route53/Internal.hs b/src/Network/AWS/Route53/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/AWS/Route53/Internal.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE LambdaCase        #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- Module      : Network.AWS.Route53.Internal
+-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
+-- License     : This Source Code Form is subject to the terms of
+--               the Mozilla Public License, v. 2.0.
+--               A copy of the MPL can be found in the LICENSE file or
+--               you can obtain it at http://mozilla.org/MPL/2.0/.
+-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
+-- Stability   : experimental
+-- Portability : non-portable (GHC extensions)
+
+module Network.AWS.Route53.Internal
+    ( module Network.AWS.Route53.Internal
+    , Region (..)
+    ) where
+
+import GHC.Generics
+import Network.AWS.Data
+import Network.AWS.Prelude
+import Network.AWS.Types   (Region(..))
+
+data RecordType
+    = A     -- ^ A
+    | AAAA  -- ^ AAAA
+    | CNAME -- ^ CNAME
+    | MX    -- ^ MX
+    | NS    -- ^ NS
+    | PTR   -- ^ PTR
+    | SOA   -- ^ SOA
+    | SPF   -- ^ SPF
+    | SRV   -- ^ SRV
+    | TXT   -- ^ TXT
+      deriving (Eq, Ord, Show, Generic, Enum)
+
+instance Hashable RecordType
+
+instance FromText RecordType where
+    parser = match "A"     A
+         <|> match "AAAA"  AAAA
+         <|> match "CNAME" CNAME
+         <|> match "MX"    MX
+         <|> match "NS"    NS
+         <|> match "PTR"   PTR
+         <|> match "SOA"   SOA
+         <|> match "SPF"   SPF
+         <|> match "SRV"   SRV
+         <|> match "TXT"   TXT
+    {-# INLINE parser #-}
+
+instance ToText RecordType where
+    toText = \case
+        A     -> "A"
+        AAAA  -> "AAAA"
+        CNAME -> "CNAME"
+        MX    -> "MX"
+        NS    -> "NS"
+        PTR   -> "PTR"
+        SOA   -> "SOA"
+        SPF   -> "SPF"
+        SRV   -> "SRV"
+        TXT   -> "TXT"
+    {-# INLINE toText #-}
+
+instance ToByteString RecordType
+instance ToHeader     RecordType
+instance ToQuery      RecordType
+
+instance FromXML RecordType where
+    parseXML = parseXMLText "RecordType"
+    {-# INLINE parseXML #-}
+
+instance ToXML RecordType where
+    toXML = toXMLText
+    {-# INLINE toXML #-}
