diff --git a/Data/XML/Types.hs b/Data/XML/Types.hs
--- a/Data/XML/Types.hs
+++ b/Data/XML/Types.hs
@@ -36,8 +36,6 @@
 	-- ** Doctypes
 	, Doctype (..)
 	, ExternalID (..)
-	, DoctypeNode (..)
-	, Declaration
 	
 	-- ** Incremental processing
 	, Event (..)
@@ -68,7 +66,6 @@
 	, attributeText
 	) where
 import Control.Monad ((>=>))
-import qualified Data.Map as M
 import Data.Maybe (isJust)
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -126,7 +123,7 @@
 
 data Element = Element
 	{ elementName :: Name
-	, elementAttributes :: M.Map Name [Content]
+	, elementAttributes :: [(Name, [Content])]
 	, elementNodes :: [Node]
 	}
 	deriving (Show, Eq)
@@ -180,15 +177,17 @@
 		(ns, local) -> Name (T.pack (drop 1 local)) (Just (T.pack ns)) Nothing
 	fromString local = Name (T.pack local) Nothing Nothing
 
+-- | Note: due to the incredible complexity of DTDs, this type only supports
+-- external subsets. I've tried adding internal subset types, but they
+-- quickly gain more code than the rest of this module put together.
+--
+-- It is possible that some future version of this library might support
+-- internal subsets, but I am no longer actively working on adding them.
 data Doctype = Doctype
 	{ doctypeName :: Text
-	, doctypeExternalID :: Maybe ExternalID
-	, doctypeNodes :: [DoctypeNode]
+	, doctypeID :: Maybe ExternalID
 	}
-	deriving (Show, Eq)
-
-instance Ord Doctype where
-	compare = compare `on` (\x -> (doctypeName x, doctypeExternalID x))
+	deriving (Show, Eq, Ord)
 
 instance Typeable Doctype where
 	typeOf = typeString "Doctype"
@@ -201,28 +200,6 @@
 instance Typeable ExternalID where
 	typeOf = typeString "ExternalID"
 
-data DoctypeNode
-	= DoctypeDeclaration Declaration
-	| DoctypeInstruction Instruction
-	| DoctypeComment Text
-	deriving (Show, Eq)
-
-instance Typeable DoctypeNode where
-	typeOf = typeString "DoctypeNode"
-
--- | Internal doctype declarations are still largely unimplemented. This
--- type will be populated and published in a later version of @xml-types@.
---
-data Declaration
-	= DeclareElement Text
-	| DeclareAttributeList Text
-	| DeclareEntity Text
-	| DeclareNotation Text
-	deriving (Show, Eq)
-
-instance Typeable Declaration where
-	typeOf = typeString "Declaration"
-
 -- | Some XML processing tools are incremental, and work in terms of events
 -- rather than node trees. The 'Event' type allows a document to be fully
 -- specified as a sequence of events.
@@ -239,10 +216,9 @@
 	= EventBeginDocument
 	| EventEndDocument
 	| EventBeginDoctype Text (Maybe ExternalID)
-	| EventDeclaration Declaration
 	| EventEndDoctype
 	| EventInstruction Instruction
-	| EventBeginElement Name (M.Map Name [Content])
+	| EventBeginElement Name [(Name, [Content])]
 	| EventEndElement Name
 	| EventContent Content
 	| EventComment Text
@@ -296,7 +272,7 @@
 hasAttributeText name p e = [e | maybe False p (attributeText name e)]
 
 attributeContent :: Name -> Element -> Maybe [Content]
-attributeContent name e = M.lookup name (elementAttributes e)
+attributeContent name e = lookup name (elementAttributes e)
 
 attributeText :: Name -> Element -> Maybe Text
 attributeText name e = fmap contentFlat (attributeContent name e)
diff --git a/xml-types.cabal b/xml-types.cabal
--- a/xml-types.cabal
+++ b/xml-types.cabal
@@ -1,5 +1,5 @@
 name: xml-types
-version: 0.2
+version: 0.3
 synopsis: Basic types for representing XML
 license: MIT
 license-file: license.txt
@@ -21,7 +21,6 @@
   build-depends:
       base >=3 && < 5
     , text
-    , containers
 
   exposed-modules:
     Data.XML.Types
