diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,12 @@
 # Changelog for horizon-spec
 
+## v0.6.4
+
+* Separate Types out into separate modules.
+* Horizon.Spec.Types.Modifiers: add `defaultModifiers`.
+* Horizon.Spec.Types.HaskellPackage: add `mkHaskellPackage`
+* Horizon.Spec.Utils: init with `call{Hackage, Git, Local, Tarball}`
+
 ## v0.6.3
 
 * Add `mkSubdir` splice function.
diff --git a/horizon-spec.cabal b/horizon-spec.cabal
--- a/horizon-spec.cabal
+++ b/horizon-spec.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               horizon-spec
-version:            0.6.3
+version:            0.6.4
 synopsis:           Horizon Stable Package Set Type Definitions
 description:
   This package contains the type definitions for the Horizon stable package set (https://horizon-haskell.net). This is a schema used to define package sets sourcing from hackage and git.
@@ -31,12 +31,41 @@
   location: https://gitlab.homotopic.tech/horizon/horizon-spec
 
 library
-  exposed-modules:    Horizon.Spec
+  exposed-modules:
+    Horizon.Spec
+    Horizon.Spec.Types.CabalFlag
+    Horizon.Spec.Types.Compiler
+    Horizon.Spec.Types.Flag
+    Horizon.Spec.Types.GitSource
+    Horizon.Spec.Types.HackageSource
+    Horizon.Spec.Types.HaskellPackage
+    Horizon.Spec.Types.HaskellSource
+    Horizon.Spec.Types.HorizonExport
+    Horizon.Spec.Types.LocalSource
+    Horizon.Spec.Types.Modifiers
+    Horizon.Spec.Types.Name
+    Horizon.Spec.Types.Overlay
+    Horizon.Spec.Types.OverlayExportSettings
+    Horizon.Spec.Types.OverlayFile
+    Horizon.Spec.Types.PackageList
+    Horizon.Spec.Types.PackagesDir
+    Horizon.Spec.Types.PackageSet
+    Horizon.Spec.Types.PackageSetExportSettings
+    Horizon.Spec.Types.PackageSetFile
+    Horizon.Spec.Types.Repo
+    Horizon.Spec.Types.Revision
+    Horizon.Spec.Types.Subdir
+    Horizon.Spec.Types.TarballSource
+    Horizon.Spec.Types.Url
+    Horizon.Spec.Types.Version
+    Horizon.Spec.Utils
+
   hs-source-dirs:     src
   default-extensions:
     DataKinds
     DeriveGeneric
     DerivingStrategies
+    DuplicateRecordFields
     GADTs
     GeneralizedNewtypeDeriving
     StandaloneKindSignatures
diff --git a/src/Horizon/Spec.hs b/src/Horizon/Spec.hs
--- a/src/Horizon/Spec.hs
+++ b/src/Horizon/Spec.hs
@@ -1,211 +1,56 @@
-{-# LANGUAGE DeriveAnyClass        #-}
+{-# OPTIONS_GHC -fno-warn-missing-import-lists #-}
 {-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE TemplateHaskell       #-}
-module Horizon.Spec
-  ( CabalFlag(MkCabalFlag)
-  , Compiler(MkCompiler, fromCompiler)
-  , Flag(Enable, Disable)
-  , GitSource(MkGitSource, url, revision, subdir)
-  , HackageSource(MkHackageSource, name, version)
-  , HaskellPackage(MkHaskellPackage, source, modifiers, flags)
-  , HaskellSource(FromGit, FromHackage, FromTarball, FromLocal)
-  , HorizonExport(MakePackageSet, MakeOverlay)
-  , LocalSource(MkLocalSource, fromLocalSource)
-  , Modifiers(MkModifiers, doJailbreak, doBenchmark, doCheck, enableProfiling, includeBenchmarks, includeExecutables, includeTests)
-  , Name(MkName, fromName)
-  , OverlayExportSettings(MkOverlayExportSettings, packagesDir, overlayFile, overlay)
-  , OverlayFile(MkOverlayFile, fromOverlayFile)
-  , Overlay(MkOverlay, fromOverlay)
-  , PackageList(MkPackageList, fromPackageList)
-  , PackageSetExportSettings(MkPackageSetExportSettings, packagesDir, packageSetFile, packageSet)
-  , PackageSetFile(MkPackageSetFile, fromPackageSetFile)
-  , PackageSet(MkPackageSet, compiler, packages)
-  , PackagesDir(MkPackagesDir, fromPackagesDir)
-  , Repo(MkRepo, fromRepo)
-  , Revision(MkRevision, fromRevision)
-  , Subdir(MkSubdir, fromSubdir)
-  , mkSubdir
-  , TarballSource(MkTarballSource, fromTarballSource)
-  , Url(MkUrl, fromUrl)
-  , Version (MkVersion, fromVersion)
+module Horizon.Spec (
+  module Horizon.Spec.Types.CabalFlag,
+  module Horizon.Spec.Types.Compiler,
+  module Horizon.Spec.Types.Flag,
+  module Horizon.Spec.Types.GitSource,
+  module Horizon.Spec.Types.HackageSource,
+  module Horizon.Spec.Types.HaskellPackage,
+  module Horizon.Spec.Types.HaskellSource,
+  module Horizon.Spec.Types.HorizonExport,
+  module Horizon.Spec.Types.LocalSource,
+  module Horizon.Spec.Types.Modifiers,
+  module Horizon.Spec.Types.Name,
+  module Horizon.Spec.Types.OverlayExportSettings,
+  module Horizon.Spec.Types.OverlayFile,
+  module Horizon.Spec.Types.Overlay,
+  module Horizon.Spec.Types.PackageList,
+  module Horizon.Spec.Types.PackageSetExportSettings
+,  module Horizon.Spec.Types.PackageSetFile
+,  module Horizon.Spec.Types.PackageSet
+,  module Horizon.Spec.Types.PackagesDir
+,  module Horizon.Spec.Types.Repo
+,  module Horizon.Spec.Types.Revision
+,  module Horizon.Spec.Types.Subdir
+,  module Horizon.Spec.Types.TarballSource
+,  module Horizon.Spec.Types.Url
+,  module Horizon.Spec.Types.Version
   )
   where
 
-import           Data.Kind                (Type)
-import           Data.Map                 (Map)
-import           Data.String              (IsString)
-import           Data.Text                (Text)
-import           Dhall                    (FromDhall, Generic, ToDhall)
-import           Language.Haskell.TH      (Exp, Q)
-import           Language.Haskell.TH.Lift (deriveLift, lift)
-import           Path                     (Dir, File, Path, Rel, parseRelDir)
-import           Path.Dhall               ()
-
-
-type Url :: Type
-newtype Url = MkUrl { fromUrl :: Text }
-  deriving stock (Eq, Show)
-  deriving newtype (FromDhall, ToDhall, IsString)
-
-type Repo :: Type
-newtype Repo = MkRepo { fromRepo :: Url }
-  deriving stock (Eq, Show)
-  deriving newtype (FromDhall, ToDhall, IsString)
-
-type Subdir :: Type
-newtype Subdir = MkSubdir { fromSubdir :: Path Rel Dir }
-  deriving stock (Eq, Show)
-  deriving newtype (FromDhall, ToDhall)
-
-$(deriveLift 'MkSubdir)
-
-mkSubdir :: FilePath -> Q Exp
-mkSubdir = either (error . show) (lift . MkSubdir) . parseRelDir
-
-type Name :: Type
-newtype Name = MkName { fromName :: Text }
-  deriving stock (Eq, Ord, Show)
-  deriving newtype (FromDhall, ToDhall, IsString)
-
-type Version :: Type
-newtype Version = MkVersion { fromVersion :: Text }
-  deriving stock (Eq, Show)
-  deriving newtype (FromDhall, ToDhall, IsString)
-
-type GitSource :: Type
-data GitSource where
-  MkGitSource :: { url :: Repo, revision :: Revision, subdir :: Maybe Subdir } -> GitSource
-  deriving stock (Eq, Show, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type HackageSource :: Type
-data HackageSource where
-  MkHackageSource :: { name :: Name, version :: Version } -> HackageSource
-  deriving stock (Eq, Show, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type LocalSource :: Type
-newtype LocalSource where
-  MkLocalSource :: { fromLocalSource :: Subdir } -> LocalSource
-  deriving stock (Eq, Show, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type TarballSource :: Type
-newtype TarballSource where
-  MkTarballSource :: { fromTarballSource :: Url } -> TarballSource
-  deriving stock (Eq, Show, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type HaskellSource :: Type
-data HaskellSource where
-  FromGit :: GitSource -> HaskellSource
-  FromHackage :: HackageSource -> HaskellSource
-  FromLocal :: LocalSource -> HaskellSource
-  FromTarball :: TarballSource -> HaskellSource
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type Flag :: Type -> Type
-data Flag a where
-  Enable :: a -> Flag a
-  Disable :: a -> Flag a
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type CabalFlag :: Type
-data CabalFlag where
-  MkCabalFlag :: Flag Text -> CabalFlag
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type Modifiers :: Type
-data Modifiers where
-  MkModifiers :: { doBenchmark :: Bool
-                 , doCheck :: Bool
-                 , doJailbreak :: Bool
-                 , enableProfiling :: Bool
-                 , includeBenchmarks :: Bool
-                 , includeExecutables :: Bool
-                 , includeTests :: Bool } -> Modifiers
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type HaskellPackage :: Type
-data HaskellPackage where
-  MkHaskellPackage :: { source :: HaskellSource
-                      , modifiers :: Modifiers
-                      , flags :: [CabalFlag] } -> HaskellPackage
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type Revision :: Type
-newtype Revision where
-  MkRevision :: { fromRevision :: Text } -> Revision
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall, IsString)
-
-type Compiler :: Type
-newtype Compiler where
-  MkCompiler :: { fromCompiler :: Text } -> Compiler
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type PackageList :: Type
-newtype PackageList where
-  MkPackageList :: { fromPackageList :: Map Name HaskellPackage } -> PackageList
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type Overlay :: Type
-newtype Overlay where
-  MkOverlay :: { fromOverlay :: PackageSet } -> Overlay
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type PackageSet :: Type
-data PackageSet where
-  MkPackageSet :: { compiler :: Compiler
-                  , packages :: PackageList } -> PackageSet
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type PackagesDir :: Type
-newtype PackagesDir where
-  MkPackagesDir :: { fromPackagesDir :: Path Rel Dir } -> PackagesDir
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type PackageSetFile :: Type
-newtype PackageSetFile where
-  MkPackageSetFile :: { fromPackageSetFile :: Path Rel File } -> PackageSetFile
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type OverlayFile :: Type
-newtype OverlayFile where
-  MkOverlayFile :: { fromOverlayFile :: Path Rel File } -> OverlayFile
-  deriving stock (Show, Eq, Generic)
-  deriving newtype (FromDhall, ToDhall)
-
-type PackageSetExportSettings :: Type
-data PackageSetExportSettings where
-  MkPackageSetExportSettings :: { packagesDir :: PackagesDir
-                                , packageSetFile :: PackageSetFile
-                                , packageSet :: PackageSet } -> PackageSetExportSettings
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type OverlayExportSettings :: Type
-data OverlayExportSettings where
-  MkOverlayExportSettings :: { packagesDir :: PackagesDir
-                             , overlayFile :: OverlayFile
-                             , overlay :: Overlay } -> OverlayExportSettings
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
-
-type HorizonExport :: Type
-data HorizonExport where
-  MakePackageSet :: PackageSetExportSettings -> HorizonExport
-  MakeOverlay :: OverlayExportSettings -> HorizonExport
-  deriving stock (Show, Eq, Generic)
-  deriving anyclass (FromDhall, ToDhall)
+import           Horizon.Spec.Types.CabalFlag
+import           Horizon.Spec.Types.Compiler
+import           Horizon.Spec.Types.Flag
+import           Horizon.Spec.Types.GitSource
+import           Horizon.Spec.Types.HackageSource
+import           Horizon.Spec.Types.HaskellPackage
+import           Horizon.Spec.Types.HaskellSource
+import           Horizon.Spec.Types.HorizonExport
+import           Horizon.Spec.Types.LocalSource
+import           Horizon.Spec.Types.Modifiers
+import           Horizon.Spec.Types.Name
+import           Horizon.Spec.Types.Overlay
+import           Horizon.Spec.Types.OverlayExportSettings
+import           Horizon.Spec.Types.OverlayFile
+import           Horizon.Spec.Types.PackageList
+import           Horizon.Spec.Types.PackagesDir
+import           Horizon.Spec.Types.PackageSet
+import           Horizon.Spec.Types.PackageSetExportSettings
+import           Horizon.Spec.Types.PackageSetFile
+import           Horizon.Spec.Types.Repo
+import           Horizon.Spec.Types.Revision
+import           Horizon.Spec.Types.Subdir
+import           Horizon.Spec.Types.TarballSource
+import           Horizon.Spec.Types.Url
+import           Horizon.Spec.Types.Version
diff --git a/src/Horizon/Spec/Types/CabalFlag.hs b/src/Horizon/Spec/Types/CabalFlag.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/CabalFlag.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.CabalFlag (CabalFlag(MkCabalFlag)) where
+
+import           Data.Kind               (Type)
+import           Data.Text               (Text)
+import           Dhall                   (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Flag (Flag)
+
+type CabalFlag :: Type
+data CabalFlag where
+  MkCabalFlag :: Flag Text -> CabalFlag
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/Compiler.hs b/src/Horizon/Spec/Types/Compiler.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Compiler.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Compiler (Compiler(MkCompiler), fromCompiler) where
+
+import           Data.Kind   (Type)
+import           Data.String (IsString)
+import           Data.Text   (Text)
+import           Dhall       (FromDhall, ToDhall)
+
+type Compiler :: Type
+newtype Compiler = MkCompiler { fromCompiler :: Text }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Types/Flag.hs b/src/Horizon/Spec/Types/Flag.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Flag.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.Flag (Flag(Enable,Disable)) where
+
+import           Data.Kind (Type)
+import           Dhall     (FromDhall, Generic, ToDhall)
+
+type Flag :: Type -> Type
+data Flag a where
+  Enable :: a -> Flag a
+  Disable :: a -> Flag a
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/GitSource.hs b/src/Horizon/Spec/Types/GitSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/GitSource.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.GitSource (GitSource(MkGitSource), url, revision, subdir) where
+
+import           Data.Kind                   (Type)
+import           Dhall                       (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Repo     (Repo)
+import           Horizon.Spec.Types.Revision (Revision)
+import           Horizon.Spec.Types.Subdir   (Subdir)
+
+type GitSource :: Type
+data GitSource where
+  MkGitSource :: { url :: Repo, revision :: Revision, subdir :: Maybe Subdir } -> GitSource
+  deriving stock (Eq, Show, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/HackageSource.hs b/src/Horizon/Spec/Types/HackageSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/HackageSource.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.HackageSource (HackageSource(MkHackageSource), name, version) where
+
+import           Data.Kind                  (Type)
+import           Dhall                      (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Name    (Name)
+import           Horizon.Spec.Types.Version (Version)
+
+type HackageSource :: Type
+data HackageSource where
+  MkHackageSource :: { name :: Name, version :: Version } -> HackageSource
+  deriving stock (Eq, Show, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/HaskellPackage.hs b/src/Horizon/Spec/Types/HaskellPackage.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/HaskellPackage.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.HaskellPackage
+  ( HaskellPackage(MkHaskellPackage)
+  , source
+  , modifiers
+  , flags
+  , mkHaskellPackage
+  ) where
+
+import           Data.Kind                        (Type)
+import           Dhall                            (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.CabalFlag     (CabalFlag)
+import           Horizon.Spec.Types.HaskellSource (HaskellSource)
+import           Horizon.Spec.Types.Modifiers     (Modifiers, defaultModifiers)
+
+type HaskellPackage :: Type
+data HaskellPackage where
+  MkHaskellPackage :: { source :: HaskellSource
+                      , modifiers :: Modifiers
+                      , flags :: [CabalFlag] } -> HaskellPackage
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
+
+mkHaskellPackage :: HaskellSource -> HaskellPackage
+mkHaskellPackage x = MkHaskellPackage { source = x, flags = [], modifiers = defaultModifiers }
diff --git a/src/Horizon/Spec/Types/HaskellSource.hs b/src/Horizon/Spec/Types/HaskellSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/HaskellSource.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Horizon.Spec.Types.HaskellSource (HaskellSource(FromGit, FromHackage, FromTarball, FromLocal)) where
+
+import           Data.Kind                        (Type)
+import           Dhall                            (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.GitSource     (GitSource)
+import           Horizon.Spec.Types.HackageSource (HackageSource)
+import           Horizon.Spec.Types.LocalSource   (LocalSource)
+import           Horizon.Spec.Types.TarballSource (TarballSource)
+
+type HaskellSource :: Type
+data HaskellSource where
+  FromGit :: GitSource -> HaskellSource
+  FromHackage :: HackageSource -> HaskellSource
+  FromLocal :: LocalSource -> HaskellSource
+  FromTarball :: TarballSource -> HaskellSource
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/HorizonExport.hs b/src/Horizon/Spec/Types/HorizonExport.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/HorizonExport.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.HorizonExport (HorizonExport(MakePackageSet, MakeOverlay)) where
+
+import           Data.Kind                                   (Type)
+import           Dhall                                       (FromDhall,
+                                                              Generic, ToDhall)
+import           Horizon.Spec.Types.OverlayExportSettings    (OverlayExportSettings)
+import           Horizon.Spec.Types.PackageSetExportSettings (PackageSetExportSettings)
+
+type HorizonExport :: Type
+data HorizonExport where
+  MakePackageSet :: PackageSetExportSettings -> HorizonExport
+  MakeOverlay :: OverlayExportSettings -> HorizonExport
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/LocalSource.hs b/src/Horizon/Spec/Types/LocalSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/LocalSource.hs
@@ -0,0 +1,12 @@
+module Horizon.Spec.Types.LocalSource (LocalSource(MkLocalSource), fromLocalSource) where
+
+import           Data.Kind                 (Type)
+import           Dhall                     (FromDhall, ToDhall)
+import           Horizon.Spec.Types.Subdir (Subdir)
+
+
+type LocalSource :: Type
+newtype LocalSource where
+  MkLocalSource :: { fromLocalSource :: Subdir } -> LocalSource
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/Modifiers.hs b/src/Horizon/Spec/Types/Modifiers.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Modifiers.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.Modifiers
+  ( Modifiers(MkModifiers)
+  , doBenchmark
+  , doCheck
+  , doJailbreak
+  , enableProfiling
+  , includeBenchmarks
+  , includeExecutables
+  , includeTests
+  , defaultModifiers
+  ) where
+
+import           Data.Kind (Type)
+import           Dhall     (FromDhall, Generic, ToDhall)
+
+
+type Modifiers :: Type
+data Modifiers where
+  MkModifiers :: { doBenchmark :: Bool
+                 , doCheck :: Bool
+                 , doJailbreak :: Bool
+                 , enableProfiling :: Bool
+                 , includeBenchmarks :: Bool
+                 , includeExecutables :: Bool
+                 , includeTests :: Bool } -> Modifiers
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
+
+
+defaultModifiers :: Modifiers
+defaultModifiers = MkModifiers
+  { doBenchmark = False
+  , doCheck = False
+  , doJailbreak = True
+  , enableProfiling = True
+  , includeBenchmarks = True
+  , includeExecutables = True
+  , includeTests = True
+  }
diff --git a/src/Horizon/Spec/Types/Name.hs b/src/Horizon/Spec/Types/Name.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Name.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Name (Name(MkName), fromName) where
+
+import           Data.Kind   (Type)
+import           Data.String (IsString)
+import           Data.Text   (Text)
+import           Dhall       (FromDhall, ToDhall)
+
+type Name :: Type
+newtype Name = MkName { fromName :: Text }
+  deriving stock (Eq, Show, Ord)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Types/Overlay.hs b/src/Horizon/Spec/Types/Overlay.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Overlay.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Overlay (Overlay(MkOverlay), fromOverlay) where
+
+import           Data.Kind                     (Type)
+import           Dhall                         (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.PackageSet (PackageSet)
+
+type Overlay :: Type
+newtype Overlay where
+  MkOverlay :: { fromOverlay :: PackageSet } -> Overlay
+  deriving stock (Show, Eq, Generic)
+  deriving newtype (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/OverlayExportSettings.hs b/src/Horizon/Spec/Types/OverlayExportSettings.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/OverlayExportSettings.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.OverlayExportSettings (OverlayExportSettings(MkOverlayExportSettings), packagesDir, overlayFile, overlay) where
+
+import           Data.Kind                      (Type)
+import           Dhall                          (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Overlay     (Overlay)
+import           Horizon.Spec.Types.OverlayFile (OverlayFile)
+import           Horizon.Spec.Types.PackagesDir (PackagesDir)
+
+type OverlayExportSettings :: Type
+data OverlayExportSettings where
+  MkOverlayExportSettings :: { packagesDir :: PackagesDir
+                                , overlayFile :: OverlayFile
+                                , overlay :: Overlay } -> OverlayExportSettings
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/OverlayFile.hs b/src/Horizon/Spec/Types/OverlayFile.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/OverlayFile.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE DeriveAnyClass  #-}
+{-# LANGUAGE TemplateHaskell #-}
+module Horizon.Spec.Types.OverlayFile (OverlayFile(MkOverlayFile), fromOverlayFile, mkOverlayFile) where
+
+import           Data.Kind                (Type)
+import           Dhall                    (FromDhall, ToDhall)
+import           Language.Haskell.TH      (Exp, Q)
+import           Language.Haskell.TH.Lift (deriveLift, lift)
+import           Path                     (File, Path, Rel, parseRelFile)
+import           Path.Dhall               ()
+
+type OverlayFile :: Type
+newtype OverlayFile = MkOverlayFile { fromOverlayFile :: Path Rel File }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall)
+
+$(deriveLift 'MkOverlayFile)
+
+mkOverlayFile :: FilePath -> Q Exp
+mkOverlayFile = either (error . show) (lift . MkOverlayFile) . parseRelFile
diff --git a/src/Horizon/Spec/Types/PackageList.hs b/src/Horizon/Spec/Types/PackageList.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/PackageList.hs
@@ -0,0 +1,13 @@
+module Horizon.Spec.Types.PackageList (PackageList(MkPackageList), fromPackageList) where
+
+import           Data.Kind                         (Type)
+import           Data.Map                          (Map)
+import           Dhall                             (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.HaskellPackage (HaskellPackage)
+import           Horizon.Spec.Types.Name           (Name)
+
+type PackageList :: Type
+newtype PackageList where
+  MkPackageList :: { fromPackageList :: Map Name HaskellPackage } -> PackageList
+  deriving stock (Show, Eq, Generic)
+  deriving newtype (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/PackageSet.hs b/src/Horizon/Spec/Types/PackageSet.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/PackageSet.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.PackageSet (PackageSet(MkPackageSet), compiler, packages) where
+
+import           Data.Kind                      (Type)
+import           Dhall                          (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Compiler    (Compiler)
+import           Horizon.Spec.Types.PackageList (PackageList)
+
+type PackageSet :: Type
+data PackageSet where
+  MkPackageSet :: { compiler :: Compiler
+                  , packages :: PackageList } -> PackageSet
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/PackageSetExportSettings.hs b/src/Horizon/Spec/Types/PackageSetExportSettings.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/PackageSetExportSettings.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE DeriveAnyClass #-}
+module Horizon.Spec.Types.PackageSetExportSettings (PackageSetExportSettings(MkPackageSetExportSettings), packagesDir, packageSetFile, packageSet) where
+
+import           Data.Kind                         (Type)
+import           Dhall                             (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.PackagesDir    (PackagesDir)
+import           Horizon.Spec.Types.PackageSet     (PackageSet)
+import           Horizon.Spec.Types.PackageSetFile (PackageSetFile)
+
+type PackageSetExportSettings :: Type
+data PackageSetExportSettings where
+  MkPackageSetExportSettings :: { packagesDir :: PackagesDir
+                                , packageSetFile :: PackageSetFile
+                                , packageSet :: PackageSet } -> PackageSetExportSettings
+  deriving stock (Show, Eq, Generic)
+  deriving anyclass (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/PackageSetFile.hs b/src/Horizon/Spec/Types/PackageSetFile.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/PackageSetFile.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE TemplateHaskell #-}
+module Horizon.Spec.Types.PackageSetFile (PackageSetFile(MkPackageSetFile), fromPackageSetFile, mkPackageSetFile) where
+
+import           Data.Kind                (Type)
+import           Dhall                    (FromDhall, ToDhall)
+import           Language.Haskell.TH      (Exp, Q)
+import           Language.Haskell.TH.Lift (deriveLift, lift)
+import           Path                     (File, Path, Rel, parseRelFile)
+import           Path.Dhall               ()
+
+type PackageSetFile :: Type
+newtype PackageSetFile = MkPackageSetFile { fromPackageSetFile :: Path Rel File }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall)
+
+$(deriveLift 'MkPackageSetFile)
+
+mkPackageSetFile :: FilePath -> Q Exp
+mkPackageSetFile = either (error . show) (lift . MkPackageSetFile) . parseRelFile
diff --git a/src/Horizon/Spec/Types/PackagesDir.hs b/src/Horizon/Spec/Types/PackagesDir.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/PackagesDir.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE TemplateHaskell #-}
+module Horizon.Spec.Types.PackagesDir (PackagesDir(MkPackagesDir), fromPackagesDir, mkPackagesDir) where
+
+import           Data.Kind                (Type)
+import           Dhall                    (FromDhall, ToDhall)
+import           Language.Haskell.TH      (Exp, Q)
+import           Language.Haskell.TH.Lift (deriveLift, lift)
+import           Path                     (Dir, Path, Rel, parseRelDir)
+import           Path.Dhall               ()
+
+type PackagesDir :: Type
+newtype PackagesDir = MkPackagesDir { fromPackagesDir :: Path Rel Dir }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall)
+
+$(deriveLift 'MkPackagesDir)
+
+mkPackagesDir :: FilePath -> Q Exp
+mkPackagesDir = either (error . show) (lift . MkPackagesDir) . parseRelDir
diff --git a/src/Horizon/Spec/Types/Repo.hs b/src/Horizon/Spec/Types/Repo.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Repo.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Repo (Repo(MkRepo), fromRepo) where
+
+import           Data.Kind              (Type)
+import           Data.String            (IsString)
+import           Dhall                  (FromDhall, ToDhall)
+import           Horizon.Spec.Types.Url (Url)
+
+type Repo :: Type
+newtype Repo = MkRepo { fromRepo :: Url }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Types/Revision.hs b/src/Horizon/Spec/Types/Revision.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Revision.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Revision (Revision(MkRevision), fromRevision) where
+
+import           Data.Kind   (Type)
+import           Data.String (IsString)
+import           Data.Text   (Text)
+import           Dhall       (FromDhall, ToDhall)
+
+type Revision :: Type
+newtype Revision = MkRevision { fromRevision :: Text }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Types/Subdir.hs b/src/Horizon/Spec/Types/Subdir.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Subdir.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE TemplateHaskell #-}
+module Horizon.Spec.Types.Subdir (Subdir(MkSubdir), fromSubdir, mkSubdir) where
+
+import           Data.Kind                (Type)
+import           Dhall                    (FromDhall, ToDhall)
+import           Language.Haskell.TH      (Exp, Q)
+import           Language.Haskell.TH.Lift (deriveLift, lift)
+import           Path                     (Dir, Path, Rel, parseRelDir)
+import           Path.Dhall               ()
+
+type Subdir :: Type
+newtype Subdir = MkSubdir { fromSubdir :: Path Rel Dir }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall)
+
+$(deriveLift 'MkSubdir)
+
+mkSubdir :: FilePath -> Q Exp
+mkSubdir = either (error . show) (lift . MkSubdir) . parseRelDir
diff --git a/src/Horizon/Spec/Types/TarballSource.hs b/src/Horizon/Spec/Types/TarballSource.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/TarballSource.hs
@@ -0,0 +1,12 @@
+module Horizon.Spec.Types.TarballSource (TarballSource(MkTarballSource), fromTarballSource) where
+
+import           Data.Kind              (Type)
+import           Dhall                  (FromDhall, Generic, ToDhall)
+import           Horizon.Spec.Types.Url (Url)
+
+
+type TarballSource :: Type
+newtype TarballSource where
+  MkTarballSource :: { fromTarballSource :: Url } -> TarballSource
+  deriving stock (Eq, Show, Generic)
+  deriving newtype (FromDhall, ToDhall)
diff --git a/src/Horizon/Spec/Types/Url.hs b/src/Horizon/Spec/Types/Url.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Url.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Url (Url(MkUrl), fromUrl) where
+
+import           Data.Kind   (Type)
+import           Data.String (IsString)
+import           Data.Text   (Text)
+import           Dhall       (FromDhall, ToDhall)
+
+type Url :: Type
+newtype Url = MkUrl { fromUrl :: Text }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Types/Version.hs b/src/Horizon/Spec/Types/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Types/Version.hs
@@ -0,0 +1,11 @@
+module Horizon.Spec.Types.Version (Version(MkVersion), fromVersion) where
+
+import           Data.Kind   (Type)
+import           Data.String (IsString)
+import           Data.Text   (Text)
+import           Dhall       (FromDhall, ToDhall)
+
+type Version :: Type
+newtype Version = MkVersion { fromVersion :: Text }
+  deriving stock (Eq, Show)
+  deriving newtype (FromDhall, ToDhall, IsString)
diff --git a/src/Horizon/Spec/Utils.hs b/src/Horizon/Spec/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Utils.hs
@@ -0,0 +1,31 @@
+module Horizon.Spec.Utils
+  ( callHackage
+  , callGit
+  , callTarball
+  , callLocal) where
+
+import           Horizon.Spec.Types.GitSource      (GitSource (MkGitSource))
+import           Horizon.Spec.Types.HackageSource  (HackageSource (MkHackageSource))
+import           Horizon.Spec.Types.HaskellPackage (HaskellPackage,
+                                                    mkHaskellPackage)
+import           Horizon.Spec.Types.HaskellSource  (HaskellSource (FromGit, FromHackage, FromLocal, FromTarball))
+import           Horizon.Spec.Types.LocalSource    (LocalSource (MkLocalSource))
+import           Horizon.Spec.Types.Name           (Name)
+import           Horizon.Spec.Types.Repo           (Repo)
+import           Horizon.Spec.Types.Revision       (Revision)
+import           Horizon.Spec.Types.Subdir         (Subdir)
+import           Horizon.Spec.Types.TarballSource  (TarballSource (MkTarballSource))
+import           Horizon.Spec.Types.Url            (Url)
+import           Horizon.Spec.Types.Version        (Version)
+
+callHackage :: Name -> Version -> HaskellPackage
+callHackage n = mkHaskellPackage . FromHackage . MkHackageSource n
+
+callGit :: Repo -> Revision -> Maybe Subdir -> HaskellPackage
+callGit u x d = mkHaskellPackage . FromGit $ MkGitSource u x d
+
+callTarball :: Url -> HaskellPackage
+callTarball = mkHaskellPackage . FromTarball . MkTarballSource
+
+callLocal :: Subdir -> HaskellPackage
+callLocal = mkHaskellPackage . FromLocal . MkLocalSource
