diff --git a/ats-pkg.cabal b/ats-pkg.cabal
--- a/ats-pkg.cabal
+++ b/ats-pkg.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.18
 name: ats-pkg
-version: 2.10.1.8
+version: 2.10.2.0
 license: BSD3
 license-file: LICENSE
 copyright: Copyright: (c) 2018 Vanessa McHale
@@ -17,6 +17,7 @@
     man/atspkg.1
     dhall/config.dhall
     dhall/atslib.dhall
+    dhall/atspkg-prelude.dhall
 extra-doc-files: README.md
                  docs/manual.tex
 
@@ -29,6 +30,11 @@
                    Cabal >=2.2,
                    cli-setup >=0.2.0.1
 
+flag static
+    description:
+        Make static binaries
+    default: False
+
 flag profile
     description:
         Enable profiling
@@ -56,6 +62,7 @@
     exposed-modules:
         Language.ATS.Package
         Distribution.ATS
+    build-tools: cpphs -any
     hs-source-dirs: src
     other-modules:
         Paths_ats_pkg
@@ -82,7 +89,6 @@
                       DerivingStrategies
     ghc-options: -Wall -Wincomplete-uni-patterns
                  -Wincomplete-record-updates
-    build-tools: cpphs
     build-depends:
         base >=4.9 && <5,
         http-client -any,
@@ -157,3 +163,6 @@
     
     if flag(development)
         ghc-options: -Werror
+    
+    if flag(static)
+        ghc-options: -static -optc-static -optl-static
diff --git a/dhall/atslib.dhall b/dhall/atslib.dhall
--- a/dhall/atslib.dhall
+++ b/dhall/atslib.dhall
@@ -39,8 +39,8 @@
 in
 
 let atslib =
-  λ(compilerVersion : List Integer) →
-    λ(libVersion : List Integer) →
+  λ(compilerVersion : List Natural) →
+    λ(libVersion : List Natural) →
       prelude.default ⫽
         { libraries =
           [
diff --git a/dhall/atspkg-prelude.dhall b/dhall/atspkg-prelude.dhall
new file mode 100644
--- /dev/null
+++ b/dhall/atspkg-prelude.dhall
@@ -0,0 +1,283 @@
+{- Dhall prelude functions -}
+let concatMapSep = http://hackage.haskell.org/package/dhall-1.14.0/src/Prelude/Text/concatMapSep
+in
+let map = http://hackage.haskell.org/package/dhall-1.14.0/src/Prelude/List/map
+in
+
+{- Types for export and supporting functions -}
+let ATSConstraint = { lower : Optional (List Natural), upper : Optional (List Natural) }
+in
+
+let LibDep = { _1 : Text, _2 : ATSConstraint }
+in
+
+let LinkType = { _1 : Text, _2 : Text }
+in
+
+let ForeignCabal = { projectFile : Optional Text, cabalFile : Text, objectFile : Text }
+in
+
+let TargetPair = { hs : Text, ats : Text, cpphs : Bool }
+in
+
+let Bin =
+  { src : Text
+  , target : Text
+  , libs : List Text
+  , hsDeps : List ForeignCabal
+  , hs2ats : List TargetPair
+  , gcBin : Bool
+  , extras : List Text
+  }
+in
+
+let Lib =
+  { name : Text
+  , src : List Text
+  , libTarget : Text
+  , libs : List Text
+  , includes : List Text
+  , hsDeps : List ForeignCabal
+  , links : List LinkType
+  , hs2ats : List TargetPair
+  , extras : List Text
+  , static : Bool
+  }
+in
+
+let Src =
+  { atsSrc : Text
+  , cTarget : Text
+  , atsGen : List TargetPair
+  , extras : List Text
+  }
+in
+
+let Script = { configure : Optional Text, build : Text, install : Text }
+in
+
+let Debian =
+  { package : Text
+  , version : List Natural
+  , maintainer : Text
+  , description : Text
+  , target : Text
+  , manpage : Optional Text
+  , binaries : List Text
+  , libraries : List Text
+  }
+in
+
+let script =
+  λ(x : {dir : Text, target : Optional Text}) →
+    { configure = [ "./configure --prefix=${x.dir}" ] : Optional Text, build = "make -j4", install = "make install" } : Script
+in
+
+let src =
+  λ(x : { atsSrc : Text, cTarget : Text }) →
+    { atsSrc = x.atsSrc
+    , cTarget = x.cTarget
+    , atsGen = []
+      : List TargetPair
+    , extras = []
+      : List Text
+    }
+in
+
+let mapSrc = λ(x : List { atsSrc : Text, cTarget : Text}) → map { atsSrc : Text, cTarget : Text } Src src x
+in
+
+{- Helper functions -}
+let patsHome =
+  ".atspkg/contrib"
+in
+
+let showVersion =
+  λ(x : List Natural) → concatMapSep "." Natural Natural/show x
+in
+
+let none = [] : Optional (List Natural)
+in
+let plainDeps = λ(x : Text) → { _1 = x, _2 = { lower = none, upper = none } }
+in
+
+let mapPlainDeps = λ(x : List Text) → map Text LibDep plainDeps x
+in
+
+{- Default configurations -}
+let dep =
+  { dir = patsHome
+  , libVersion = [0,1,0]
+  , libDeps = []
+    : List LibDep
+  , libBldDeps = []
+    : List LibDep
+  , libCDeps = []
+    : List LibDep
+  , description = []
+    : Optional Text
+  , script = []
+    : List Text
+  }
+in
+
+let common =
+  { libs = ([] : List Text)
+  , hsDeps = ([] : List ForeignCabal)
+  , hs2ats = ([] : List TargetPair)
+  , extras = ([] : List Text)
+  }
+in
+
+let bin =
+  common ⫽ { gcBin = False }
+in
+
+let lib =
+  common ⫽
+    { links = ([] : List { _1 : Text, _2 : Text })
+    , includes = ([] : List Text)
+    , static = False
+    }
+in
+
+let staticLib =
+  lib ⫽ { static = True }
+in
+
+let Solver = constructors < PatsSolve : {} | Z3 : {} | Ignore : {} >
+in
+
+let solver = Solver.PatsSolve {=}
+in
+
+let ignore = Solver.Ignore {=}
+in
+
+let default
+  = { bin = []
+      : List Bin
+    , test = []
+      : List Bin
+    , libraries = []
+      : List Lib
+    , man = ([] : Optional Text)
+    , completions = ([] : Optional Text)
+    , version = [0,3,9]
+    , compiler = [0,3,10]
+    , dependencies = []
+      : List LibDep
+    , clib = []
+      : List LibDep
+    , buildDeps = []
+      : List LibDep
+    , ccompiler = "gcc"
+    , cflags = [ "-O2" ]
+    , atsFlags = []
+      : List Text
+    , atsSource = []
+      : List Src
+    , dynLink = True
+    , extSolve = solver
+    , debPkg = []
+      : Optional Debian
+    , atsLib = True
+    }
+in
+
+let debian =
+  λ(project : Text) →
+  { package = project
+  , target = "target/${project}.deb"
+  , manpage = []
+    : Optional Text
+  , binaries = []
+    : List Text
+  , libraries = []
+    : List Text
+  }
+in
+
+{- Package functions -}
+let makePkg =
+  λ(rec : { x : List Natural, name : Text, githubUsername : Text}) →
+    dep ⫽
+      { libName = rec.name
+      , dir = "${patsHome}"
+      , url = "https://github.com/${rec.githubUsername}/${rec.name}/archive/${showVersion rec.x}.tar.gz"
+      , libVersion = rec.x
+      }
+in
+
+let makeNpmPkg =
+  λ(rec : { x : List Natural, name : Text, unpackDir : Text }) →
+    dep ⫽
+      { libName = rec.name
+      , dir = "${patsHome}/${rec.unpackDir}"
+      , url = "https://registry.npmjs.org/${rec.unpackDir}/-/${rec.unpackDir}-${showVersion rec.x}.tgz"
+      , libVersion = rec.x
+      }
+in
+
+let makeHsPkg =
+  λ(rec : { x : List Natural, name : Text }) →
+    dep ⫽
+      { libName = rec.name
+      , dir = "${patsHome}"
+      , url = "https://hackage.haskell.org/package/${rec.name}-${showVersion rec.x}/${rec.name}-${showVersion rec.x}.tar.gz"
+      , libVersion = rec.x
+      }
+in
+
+let makePkgDescr =
+  λ(x : { x : List Natural, name : Text, githubUsername : Text, description : Text }) →
+    makePkg { x = x.x, name = x.name, githubUsername = x.githubUsername }
+      ⫽ { description = [ x.description ] : Optional Text }
+in
+
+let cabalDir = "dist-newstyle/lib"
+in
+
+{- Various empty directories because Dhall no longer allows type exports -}
+let emptySrc =
+  [] : List Src
+in
+
+let emptyBin =
+  [] : List Bin
+in
+
+let emptyLib =
+  [] : List Lib
+in
+
+let mkDeb =
+  λ(deb : Debian) →
+    [ deb ] : Optional Debian
+in
+
+{- We collect everything in a single record for convenience -}
+{ mkDeb = mkDeb
+, emptySrc = emptySrc
+, emptyBin = emptyBin
+, emptyLib = emptyLib
+, showVersion = showVersion
+, makePkg = makePkg
+, bin = bin
+, lib = lib
+, dep = dep
+, staticLib = staticLib
+, default = default
+, plainDeps = plainDeps
+, mapPlainDeps = mapPlainDeps
+, src = src
+, mapSrc = mapSrc
+, makePkgDescr = makePkgDescr
+, makeHsPkg = makeHsPkg
+, makeNpmPkg = makeNpmPkg
+, patsHome = patsHome
+, cabalDir = cabalDir
+, solver = solver
+, ignore = ignore
+, debian = debian
+}
