diff --git a/llvm-general-pure.cabal b/llvm-general-pure.cabal
--- a/llvm-general-pure.cabal
+++ b/llvm-general-pure.cabal
@@ -1,5 +1,5 @@
 name: llvm-general-pure
-version: 3.4.2.0
+version: 3.4.2.1
 license: BSD3
 license-file: LICENSE
 author: Benjamin S.Scarlet <fgthb0@greynode.net>
@@ -15,7 +15,7 @@
   It includes an ADT to represent LLVM IR (<http://llvm.org/docs/LangRef.html>). The llvm-general package
   builds on this one with FFI bindings to LLVM, but llvm-general-pure does not require LLVM to be available.
   .
-  For haddock, see <http://bscarlet.github.io/llvm-general/3.4.2.0/doc/html/llvm-general-pure/index.html>.
+  For haddock, see <http://bscarlet.github.io/llvm-general/3.4.2.1/doc/html/llvm-general-pure/index.html>.
    
 source-repository head
   type: git
@@ -74,7 +74,7 @@
     HUnit >= 1.2.4.2,
     test-framework-quickcheck2 >= 0.3.0.1,
     QuickCheck >= 2.5.1.1,
-    llvm-general-pure == 3.4.2.0,
+    llvm-general-pure == 3.4.2.1,
     containers >= 0.4.2.1,
     mtl >= 2.0.1.0
   hs-source-dirs: test
diff --git a/src/LLVM/General/AST.hs b/src/LLVM/General/AST.hs
--- a/src/LLVM/General/AST.hs
+++ b/src/LLVM/General/AST.hs
@@ -16,6 +16,8 @@
   module LLVM.General.AST.Type
   ) where
 
+import Data.Data
+
 import LLVM.General.AST.Name
 import LLVM.General.AST.Type
 import LLVM.General.AST.Global
@@ -30,7 +32,7 @@
   | MetadataNodeDefinition MetadataNodeID [Maybe Operand]
   | NamedMetadataDefinition String [MetadataNodeID]
   | ModuleInlineAssembly String
-    deriving (Eq, Read, Show)
+    deriving (Eq, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/docs/LangRef.html#modulestructure>
 data Module = 
@@ -41,7 +43,7 @@
     moduleTargetTriple :: Maybe String,
     moduleDefinitions :: [Definition]
   } 
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | helper for making 'Module's
 defaultModule = 
diff --git a/src/LLVM/General/AST/AddrSpace.hs b/src/LLVM/General/AST/AddrSpace.hs
--- a/src/LLVM/General/AST/AddrSpace.hs
+++ b/src/LLVM/General/AST/AddrSpace.hs
@@ -1,8 +1,9 @@
 -- | Pointers exist in Address Spaces 
 module LLVM.General.AST.AddrSpace where
 
+import Data.Data
 import Data.Word
 
 -- | See <http://llvm.org/docs/LangRef.html#pointer-type>
 data AddrSpace = AddrSpace Word32
-   deriving (Eq, Ord, Read, Show)
+   deriving (Eq, Ord, Read, Show, Typeable, Data)
diff --git a/src/LLVM/General/AST/Attribute.hs b/src/LLVM/General/AST/Attribute.hs
--- a/src/LLVM/General/AST/Attribute.hs
+++ b/src/LLVM/General/AST/Attribute.hs
@@ -1,6 +1,7 @@
 -- | Module to allow importing 'Attribute' distinctly qualified.
 module LLVM.General.AST.Attribute where
 
+import Data.Data
 import Data.Word
 
 -- | <http://llvm.org/docs/LangRef.html#parameter-attributes>
@@ -13,7 +14,7 @@
     | ByVal
     | NoCapture
     | Nest
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/docs/LangRef.html#function-attributes>
 data FunctionAttribute
@@ -35,4 +36,4 @@
     | ReturnsTwice
     | UWTable
     | NonLazyBind
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
diff --git a/src/LLVM/General/AST/Constant.hs b/src/LLVM/General/AST/Constant.hs
--- a/src/LLVM/General/AST/Constant.hs
+++ b/src/LLVM/General/AST/Constant.hs
@@ -1,6 +1,7 @@
 -- | A representation of LLVM constants
 module LLVM.General.AST.Constant where
 
+import Data.Data
 import Data.Word (Word32)
 import Data.Bits ((.|.), (.&.), complement, testBit, shiftL)
 
@@ -205,7 +206,7 @@
         element :: Constant,
         indices' :: [Word32]
       }
-    deriving (Eq, Ord, Read, Show)
+    deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 
 -- | Since LLVM types don't include signedness, there's ambiguity in interpreting
diff --git a/src/LLVM/General/AST/DataLayout.hs b/src/LLVM/General/AST/DataLayout.hs
--- a/src/LLVM/General/AST/DataLayout.hs
+++ b/src/LLVM/General/AST/DataLayout.hs
@@ -1,6 +1,7 @@
 -- | <http://llvm.org/docs/LangRef.html#data-layout>
 module LLVM.General.AST.DataLayout where
 
+import Data.Data
 import Data.Word
 
 import Data.Map (Map)
@@ -11,14 +12,14 @@
 
 -- | Little Endian is the one true way :-). Sadly, we must support the infidels.
 data Endianness = LittleEndian | BigEndian
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | An AlignmentInfo describes how a given type must and would best be aligned
 data AlignmentInfo = AlignmentInfo {
     abiAlignment :: Word32,
     preferredAlignment :: Maybe Word32
   }
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | A type of type for which 'AlignmentInfo' may be specified
 data AlignType
@@ -27,7 +28,7 @@
   | FloatAlign
   | AggregateAlign
   | StackAlign
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | a description of the various data layout properties which may be used during
 -- optimization
@@ -38,7 +39,7 @@
     typeLayouts :: Map (AlignType, Word32) AlignmentInfo,
     nativeSizes :: Maybe (Set Word32)
   }
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | a 'DataLayout' which specifies nothing
 defaultDataLayout = DataLayout {
diff --git a/src/LLVM/General/AST/Float.hs b/src/LLVM/General/AST/Float.hs
--- a/src/LLVM/General/AST/Float.hs
+++ b/src/LLVM/General/AST/Float.hs
@@ -3,6 +3,7 @@
 module LLVM.General.AST.Float where
 
 import Prelude as P
+import Data.Data
 import Data.Word (Word16, Word64)
 
 -- | A type summing up the various float types.
@@ -15,5 +16,5 @@
   | Quadruple Word64 Word64
   | X86_FP80 Word16 Word64
   | PPC_FP128 Word64 Word64
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
diff --git a/src/LLVM/General/AST/Global.hs b/src/LLVM/General/AST/Global.hs
--- a/src/LLVM/General/AST/Global.hs
+++ b/src/LLVM/General/AST/Global.hs
@@ -1,6 +1,7 @@
 -- | 'Global's - top-level values in 'Module's - and supporting structures.
 module LLVM.General.AST.Global where
 
+import Data.Data
 import Data.Word
 
 import LLVM.General.AST.Name
@@ -52,17 +53,17 @@
         garbageCollectorName :: Maybe String,
         basicBlocks :: [BasicBlock]
       }
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | 'Parameter's for 'Function's
 data Parameter = Parameter Type Name [A.ParameterAttribute]
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/doxygen/classllvm_1_1BasicBlock.html>
 -- LLVM code in a function is a sequence of 'BasicBlock's each with a label,
 -- some instructions, and a terminator.
 data BasicBlock = BasicBlock Name [Named Instruction] (Named Terminator)
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | helper for making 'GlobalVariable's
 globalVariableDefaults :: Global
diff --git a/src/LLVM/General/AST/InlineAssembly.hs b/src/LLVM/General/AST/InlineAssembly.hs
--- a/src/LLVM/General/AST/InlineAssembly.hs
+++ b/src/LLVM/General/AST/InlineAssembly.hs
@@ -24,4 +24,4 @@
       alignStack :: Bool,
       dialect :: Dialect
     }
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
diff --git a/src/LLVM/General/AST/Instruction.hs b/src/LLVM/General/AST/Instruction.hs
--- a/src/LLVM/General/AST/Instruction.hs
+++ b/src/LLVM/General/AST/Instruction.hs
@@ -63,7 +63,7 @@
   | Unreachable {
       metadata' :: InstructionMetadata
     }
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/docs/LangRef.html#atomic-memory-ordering-constraints>
 -- <http://llvm.org/docs/Atomics.html>
@@ -81,13 +81,13 @@
   crossThread :: Bool, -- ^ <http://llvm.org/docs/LangRef.html#singlethread>
   memoryOrdering :: MemoryOrdering
  }
- deriving (Eq, Ord, Read, Show)
+ deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | For the redoubtably complex 'LandingPad' instruction
 data LandingPadClause
     = Catch Constant
     | Filter Constant
-    deriving (Eq, Ord, Read, Show)
+    deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | non-terminator instructions:
 -- <http://llvm.org/docs/LangRef.html#binaryops>
@@ -381,11 +381,11 @@
       clauses :: [LandingPadClause],
       metadata :: InstructionMetadata 
     }
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
 
 -- | Instances of instructions may be given a name, allowing their results to be referenced as 'Operand's.
 -- Sometimes instructions - e.g. a call to a function returning void - don't need names.
 data Named a 
   = Name := a
   | Do a
-  deriving (Eq, Read, Show)
+  deriving (Eq, Read, Show, Typeable, Data)
diff --git a/src/LLVM/General/AST/Name.hs b/src/LLVM/General/AST/Name.hs
--- a/src/LLVM/General/AST/Name.hs
+++ b/src/LLVM/General/AST/Name.hs
@@ -1,6 +1,7 @@
 -- | Names as used in LLVM IR
 module LLVM.General.AST.Name where
 
+import Data.Data
 import Data.Word
 
 {- |
@@ -27,5 +28,5 @@
 data Name 
     = Name String -- ^ a string name 
     | UnName Word -- ^ a number for a nameless thing
-   deriving (Eq, Ord, Read, Show)
+   deriving (Eq, Ord, Read, Show, Typeable, Data)
 
diff --git a/src/LLVM/General/AST/Operand.hs b/src/LLVM/General/AST/Operand.hs
--- a/src/LLVM/General/AST/Operand.hs
+++ b/src/LLVM/General/AST/Operand.hs
@@ -1,6 +1,7 @@
 -- | A type to represent operands to LLVM 'LLVM.General.AST.Instruction.Instruction's
 module LLVM.General.AST.Operand where
-  
+
+import Data.Data
 import Data.Word
 
 import LLVM.General.AST.Name
@@ -11,13 +12,13 @@
 -- Note this is different from "named metadata", which are represented with
 -- 'LLVM.General.AST.NamedMetadataDefinition'.
 newtype MetadataNodeID = MetadataNodeID Word
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/docs/LangRef.html#metadata>
 data MetadataNode 
   = MetadataNode [Maybe Operand]
   | MetadataNodeReference MetadataNodeID
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | An 'Operand' is roughly that which is an argument to an 'LLVM.General.AST.Instruction.Instruction'
 data Operand 
@@ -27,7 +28,7 @@
   | ConstantOperand Constant
   | MetadataStringOperand String
   | MetadataNodeOperand MetadataNode
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | The 'LLVM.General.AST.Instruction.Call' instruction is special: the callee can be inline assembly
 type CallableOperand  = Either InlineAssembly Operand
diff --git a/src/LLVM/General/AST/Type.hs b/src/LLVM/General/AST/Type.hs
--- a/src/LLVM/General/AST/Type.hs
+++ b/src/LLVM/General/AST/Type.hs
@@ -1,11 +1,12 @@
 -- | A representation of an LLVM type
 module LLVM.General.AST.Type where
 
+import Data.Data
+import Data.Word (Word32, Word64)
+
 import LLVM.General.AST.AddrSpace
 import LLVM.General.AST.Name
 
-import Data.Word (Word32, Word64)
-
 -- | LLVM supports some special formats floating point format. This type is to distinguish those format.
 -- I believe it's treated as a format for "a" float, as opposed to a vector of two floats, because
 -- its intended usage is to represent a single number with a combined significand.
@@ -13,7 +14,7 @@
   = IEEE
   | DoubleExtended
   | PairOfFloats
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
 
 -- | <http://llvm.org/docs/LangRef.html#type-system>
 data Type
@@ -37,4 +38,4 @@
   | NamedTypeReference Name
   -- | <http://llvm.org/docs/LangRef.html#metadata-type>
   | MetadataType -- only to be used as a parameter type for a few intrinsics
-  deriving (Eq, Ord, Read, Show)
+  deriving (Eq, Ord, Read, Show, Typeable, Data)
