diff --git a/bond-haskell-compiler.cabal b/bond-haskell-compiler.cabal
--- a/bond-haskell-compiler.cabal
+++ b/bond-haskell-compiler.cabal
@@ -1,5 +1,5 @@
 name:                bond-haskell-compiler
-version:             0.1.3.0
+version:             0.1.3.1
 synopsis:            Bond code generator for Haskell
 description:         Bond is a cross-platform framework for handling schematized
                      data. It supports cross-language de/serialization and
@@ -22,7 +22,8 @@
 
 library
   hs-source-dirs:      src
-  exposed-modules:     Language.Bond.Codegen.Haskell.Decl
+  exposed-modules:     Language.Bond.Codegen.Haskell.AliasDecl
+                       Language.Bond.Codegen.Haskell.Decl
                        Language.Bond.Codegen.Haskell.EnumDecl
                        Language.Bond.Codegen.Haskell.SchemaDecl
                        Language.Bond.Codegen.Haskell.StructDecl
@@ -31,7 +32,7 @@
   build-depends:       base >= 4.7 && < 5
                      , bond >= 0.4.1.0 && < 0.4.2.0
                      , filepath >= 1.0
-                     , haskell-src-exts >= 1.16
+                     , haskell-src-exts >= 1.16 && < 1.18
   default-language:    Haskell2010
 
 executable hbc
diff --git a/src/Language/Bond/Codegen/Haskell/AliasDecl.hs b/src/Language/Bond/Codegen/Haskell/AliasDecl.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Bond/Codegen/Haskell/AliasDecl.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE NamedFieldPuns #-}
+module Language.Bond.Codegen.Haskell.AliasDecl (
+        aliasDecl
+    ) where
+
+import Language.Bond.Syntax.Types
+import Language.Bond.Codegen.TypeMapping (MappingContext(..))
+import Language.Bond.Codegen.Haskell.Util
+import Language.Haskell.Exts hiding (mode)
+import Language.Haskell.Exts.SrcLoc (noLoc)
+
+aliasDecl :: CodegenOpts -> MappingContext -> ModuleName -> Declaration -> Maybe Module
+aliasDecl opts ctx moduleName decl@Alias{} = Just source
+    where
+    source = Module noLoc moduleName
+        [ ]
+        Nothing
+        Nothing
+        imports
+        [synonymDecl]
+    typeName = mkType $ makeDeclName decl
+    typeParams = map (\TypeParam{paramName} -> UnkindedVar $ mkVar paramName) (declParams decl)
+    typeDecl = hsType (setType opts) ctx $ aliasType decl
+    imports = map makeImport $ unique $ getTypeModules typeDecl
+    makeImport m | m == internalModuleAlias = importInternalModule
+                 | otherwise = importTemplate{importModule = m}
+    synonymDecl = TypeDecl noLoc typeName typeParams typeDecl
+
+aliasDecl _ _ _ _ = error "aliasDecl called for invalid type"
diff --git a/src/Language/Bond/Codegen/Haskell/Decl.hs b/src/Language/Bond/Codegen/Haskell/Decl.hs
--- a/src/Language/Bond/Codegen/Haskell/Decl.hs
+++ b/src/Language/Bond/Codegen/Haskell/Decl.hs
@@ -8,6 +8,7 @@
 
 import Language.Bond.Syntax.Types
 import Language.Bond.Codegen.TypeMapping (MappingContext)
+import Language.Bond.Codegen.Haskell.AliasDecl
 import Language.Bond.Codegen.Haskell.EnumDecl
 import Language.Bond.Codegen.Haskell.StructDecl
 import Language.Bond.Codegen.Haskell.Util
@@ -40,6 +41,7 @@
     code = case decl of
         Enum{} -> enumDecl opts ctx modName decl
         Struct{} -> structDecl opts ctx modName decl
+        Alias{} -> aliasDecl opts ctx modName decl
         _ -> Nothing
     hsModule = capitalize (makeDeclName decl)
     hsNamespaces = map capitalize $ getNamespace ctx
diff --git a/src/Language/Bond/Codegen/Haskell/StructDecl.hs b/src/Language/Bond/Codegen/Haskell/StructDecl.hs
--- a/src/Language/Bond/Codegen/Haskell/StructDecl.hs
+++ b/src/Language/Bond/Codegen/Haskell/StructDecl.hs
@@ -16,12 +16,6 @@
 baseStructField :: Name
 baseStructField = Ident "base'"
 
-getTypeModules :: Language.Haskell.Exts.Type -> [ModuleName]
-getTypeModules (TyCon (Qual moduleName _)) = [moduleName]
-getTypeModules (TyApp t1 t2) = getTypeModules t1 ++ getTypeModules t2
-getTypeModules (TyList t) = getTypeModules t
-getTypeModules _ = []
-
 defaultFieldValue :: MappingContext -> Language.Bond.Syntax.Types.Field -> FieldUpdate
 defaultFieldValue ctx f@Field{fieldType, fieldDefault}
     = FieldUpdate (UnQual $ mkVar $ makeFieldName f) (defValue fieldDefault)
diff --git a/src/Language/Bond/Codegen/Haskell/Util.hs b/src/Language/Bond/Codegen/Haskell/Util.hs
--- a/src/Language/Bond/Codegen/Haskell/Util.hs
+++ b/src/Language/Bond/Codegen/Haskell/Util.hs
@@ -143,17 +143,23 @@
 hsType s c (BT_Map key value) = TyApp (TyApp (implType "Map") (hsType s c key)) (hsType s c value)
 hsType s c (BT_Bonded type_) = TyApp (implType "Bonded") (hsType s c type_)
 hsType _ _ (BT_TypeParam type_) = TyVar $ mkVar $ paramName type_
-hsType _ _ (BT_UserDefined Alias{} _) = error "BT_UserDefined Alias"
 hsType s c (BT_UserDefined decl params) = foldl1 TyApp $ declType : map (hsType s c) params
     where
     declType = let ns = getDeclNamespace c decl
                    typename = declName decl
                 in TyCon $ Qual (mkModuleName ns typename) (mkType typename)
 
+getTypeModules :: Language.Haskell.Exts.Type -> [ModuleName]
+getTypeModules (TyCon (Qual moduleName _)) = [moduleName]
+getTypeModules (TyApp t1 t2) = getTypeModules t1 ++ getTypeModules t2
+getTypeModules (TyList t) = getTypeModules t
+getTypeModules _ = []
+
 proxyOf :: Language.Haskell.Exts.Type -> Exp
 proxyOf = ExpTypeSig noLoc (Con $ implQual "Proxy") . TyApp (TyCon $ implQual "Proxy")
 
 makeDeclName :: Declaration -> String
+makeDeclName decl@Alias{} = declName decl
 makeDeclName decl = overrideName (declName decl) (declAttributes decl)
 
 makeFieldName :: Field -> String
