diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,23 @@
 # dhall-to-cabal change log
 
+## 1.3.3.0 -- 2019-05-15
+
+* All constructors that previously took an empty record now use the
+  new nullary syntax instead. This is a breaking change for user code.
+  For example, instead of `types.Compiler.GHC {=}`, now you just write
+  `types.Compiler.GHC`.
+
+* Use `dhall` version 1.23.0.
+
+* Educated `--print-type` about `Scope` and `ModuleRenaming`.
+
+* Fix `cabal-to-dhall` output for unknown licenses using `cabal` spec
+  version below `2.0`. Now it uses values of type `License.Unknown Text` 
+  for them.
+
+* Improved `--print-type` and `--print-default` output to use
+  multi-binding `let`.
+
 ## 1.3.2.0 -- 2019-02-12
 
 * Use `dhall` version 1.20.1.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -30,17 +30,21 @@
 `dhall-to-cabal --print-type`. (In the future, we will have more human-ready
 documentation - we'd love your help here!)
 
-Once you have your Dhall file ready, run it through `dhall-to-cabal` and
-redirect the output to a Cabal file:
+Once you have your Dhall file ready, point `dhall-to-cabal` at it:
 
 ``` shell
-dhall-to-cabal input.dhall > output.cabal
+dhall-to-cabal input.dhall
 ```
 
-(Replace the names `input.dhall` and `output.dhall`).
+(Replace the name `input.dhall` with your actual input file).
 
-That's it!
+That's it! `dhall-to-cabal` does the rest - it will figure out what
+the `.cabal` file should be called, and write it out next to the
+input.
 
+If you'd rather put the file somewhere else, have a look at
+`dhall-to-cabal --help` and use one of the `--output-*` options.
+
 ### cabal-to-dhall
 
 Good news! `dhall-to-cabal` is currently running a two-for-one deal! By
@@ -75,7 +79,7 @@
 To give you an example of a Dhall expression, let's jump straight in and see an
 example of a Dhall expression that can be used with `dhall-to-cabal`:
 
-```
+```haskell
     let GitHub-project =
           https://raw.githubusercontent.com/ocharles/dhall-to-cabal/1.0.0/dhall/GitHub-project.dhall
 
@@ -140,7 +144,7 @@
 
 A small example Cabal file is
 
-```
+```cabal
 name: example
 cabal-version: 2.0
 build-type: Simple
@@ -244,7 +248,7 @@
   Haskell *web applications* look like? Does the separate of `library`,
   `executable`, and `test-suite` make sense here? Maybe we'd rather:
   
-  ```
+  ```haskell
   servant-project {
     api-route = "My.API.Route"
     server = "My.API.Server"
diff --git a/dhall-to-cabal.cabal b/dhall-to-cabal.cabal
--- a/dhall-to-cabal.cabal
+++ b/dhall-to-cabal.cabal
@@ -9,7 +9,7 @@
 -- 'dhall-to-cabal -- dhall-to-cabal.dhall'.
 -- * * * * * * * * * * * * WARNING * * * * * * * * * * * *
 name: dhall-to-cabal
-version: 1.3.2.0
+version: 1.3.3.0
 license: MIT
 license-file: LICENSE
 maintainer: ollie@ocharles.org.uk
@@ -28,76 +28,7 @@
 extra-source-files:
     Changelog.md
     README.md
-    dhall/SPDX/and.dhall
-    dhall/SPDX/license.dhall
-    dhall/SPDX/licenseVersionOrLater.dhall
-    dhall/SPDX/or.dhall
-    dhall/SPDX/ref.dhall
-    dhall/SPDX/refWithFile.dhall
-    dhall/Version/v.dhall
-    dhall/VersionRange/anyVersion.dhall
-    dhall/VersionRange/differenceVersionRanges.dhall
-    dhall/VersionRange/earlierVersion.dhall
-    dhall/VersionRange/intersectVersionRanges.dhall
-    dhall/VersionRange/invertVersionRange.dhall
-    dhall/VersionRange/laterVersion.dhall
-    dhall/VersionRange/majorBoundVersion.dhall
-    dhall/VersionRange/noVersion.dhall
-    dhall/VersionRange/notThisVersion.dhall
-    dhall/VersionRange/orEarlierVersion.dhall
-    dhall/VersionRange/orLaterVersion.dhall
-    dhall/VersionRange/thisVersion.dhall
-    dhall/VersionRange/unionVersionRanges.dhall
-    dhall/VersionRange/withinVersion.dhall
-    dhall/defaults/Benchmark.dhall
-    dhall/defaults/BuildInfo.dhall
-    dhall/defaults/CompilerOptions.dhall
-    dhall/defaults/Executable.dhall
-    dhall/defaults/Library.dhall
-    dhall/defaults/Package.dhall
-    dhall/defaults/SourceRepo.dhall
-    dhall/defaults/TestSuite.dhall
-    dhall/prelude.dhall
-    dhall/types.dhall
-    dhall/types/Arch.dhall
-    dhall/types/Benchmark.dhall
-    dhall/types/BuildInfo.dhall
-    dhall/types/BuildType.dhall
-    dhall/types/Compiler.dhall
-    dhall/types/CompilerOptions.dhall
-    dhall/types/Config.dhall
-    dhall/types/CustomSetup.dhall
-    dhall/types/Dependency.dhall
-    dhall/types/Executable.dhall
-    dhall/types/Extension.dhall
-    dhall/types/Flag.dhall
-    dhall/types/ForeignLibrary.dhall
-    dhall/types/Guarded.dhall
-    dhall/types/Language.dhall
-    dhall/types/Library.dhall
-    dhall/types/License.dhall
-    dhall/types/Mixin.dhall
-    dhall/types/ModuleRenaming.dhall
-    dhall/types/OS.dhall
-    dhall/types/Package.dhall
-    dhall/types/RepoKind.dhall
-    dhall/types/RepoType.dhall
-    dhall/types/SPDX.dhall
-    dhall/types/SPDX/LicenseExceptionId.dhall
-    dhall/types/SPDX/LicenseId.dhall
-    dhall/types/Scope.dhall
-    dhall/types/SetupBuildInfo.dhall
-    dhall/types/SourceRepo.dhall
-    dhall/types/TestSuite.dhall
-    dhall/types/TestType.dhall
-    dhall/types/Version.dhall
-    dhall/types/VersionRange.dhall
-    dhall/types/builtin.dhall
-    dhall/unconditional.dhall
-    dhall/utils/GitHub-project.dhall
-    dhall/utils/majorVersions.dhall
-    dhall/utils/mapSourceRepos.dhall
-    dhall/utils/package.dhall
+    dhall/**/*.dhall
     golden-tests/dhall-to-cabal/*.dhall
     golden-tests/dhall-to-cabal/*.cabal
     golden-tests/cabal-to-dhall/*.dhall
@@ -135,9 +66,8 @@
         bytestring ^>=0.10,
         containers ^>=0.5 || ^>=0.6,
         contravariant ^>=1.4 || ^>=1.5,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         filepath ^>=1.4,
-        hashable ^>=1.2.6.1,
         text ^>=1.2,
         transformers ^>=0.5.2,
         vector ^>=0.12
@@ -159,7 +89,7 @@
     build-depends:
         Cabal ^>=2.4,
         base ^>=4.10 || ^>=4.11 || ^>=4.12,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         dhall-to-cabal -any,
         directory ^>=1.3.0.2,
         filepath ^>=1.4,
@@ -185,7 +115,7 @@
                  -fno-warn-name-shadowing
     build-depends:
         base ^>=4.10 || ^>=4.11 || ^>=4.12,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         bytestring ^>=0.10,
         dhall-to-cabal -any,
         optparse-applicative ^>=0.13.2 || ^>=0.14,
@@ -205,7 +135,7 @@
     build-depends:
         base ^>=4.10 || ^>=4.11 || ^>=4.12,
         directory ^>=1.3.0.2,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         dhall-to-cabal -any,
         filepath ^>=1.4,
         optparse-applicative ^>=0.13.2 || ^>=0.14,
@@ -226,12 +156,12 @@
         Cabal ^>=2.4,
         Diff ^>=0.3.4,
         bytestring ^>=0.10,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         dhall-to-cabal -any,
         filepath ^>=1.4,
         microlens ^>=0.1.0.0 || ^>=0.2.0.0 || ^>=0.3.0.0 || ^>=0.4.0.0,
         prettyprinter ^>=1.2.0.1,
-        tasty ^>=0.11 || ^>=0.12 || ^>=1.0 || ^>=1.1,
+        tasty ^>=0.11 || ^>=0.12 || ^>=1.0 || ^>=1.1 || ^>=1.2,
         tasty-golden ^>=2.3,
         text ^>=1.2
 
@@ -250,8 +180,8 @@
     build-depends:
         base ^>=4.10 || ^>=4.11 || ^>=4.12,
         Cabal ^>=2.4,
-        dhall ^>=1.20.1,
+        dhall ^>=1.23.0,
         dhall-to-cabal -any,
-        tasty ^>=0.11 || ^>=0.12 || ^>=1.0 || ^>=1.1,
+        tasty ^>=0.11 || ^>=0.12 || ^>=1.0 || ^>=1.1 || ^>=1.2,
         tasty-hunit ^>=0.10.0.1,
         text ^>=1.2
diff --git a/dhall/defaults/Benchmark.dhall b/dhall/defaults/Benchmark.dhall
--- a/dhall/defaults/Benchmark.dhall
+++ b/dhall/defaults/Benchmark.dhall
@@ -1,2 +1,2 @@
 -- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).
-././BuildInfo.dhall
+let types = ./../types.dhall in ././BuildInfo.dhall
diff --git a/dhall/defaults/BuildInfo.dhall b/dhall/defaults/BuildInfo.dhall
--- a/dhall/defaults/BuildInfo.dhall
+++ b/dhall/defaults/BuildInfo.dhall
diff --git a/dhall/defaults/CompilerOptions.dhall b/dhall/defaults/CompilerOptions.dhall
--- a/dhall/defaults/CompilerOptions.dhall
+++ b/dhall/defaults/CompilerOptions.dhall
@@ -1,24 +1,26 @@
 -- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).
-{ Eta =
-    [] : List Text
-, GHC =
-    [] : List Text
-, GHCJS =
-    [] : List Text
-, HBC =
-    [] : List Text
-, Helium =
-    [] : List Text
-, Hugs =
-    [] : List Text
-, JHC =
-    [] : List Text
-, LHC =
-    [] : List Text
-, NHC =
-    [] : List Text
-, UHC =
-    [] : List Text
-, YHC =
-    [] : List Text
-}
+let types = ./../types.dhall
+
+in  { Eta =
+        [] : List Text
+    , GHC =
+        [] : List Text
+    , GHCJS =
+        [] : List Text
+    , HBC =
+        [] : List Text
+    , Helium =
+        [] : List Text
+    , Hugs =
+        [] : List Text
+    , JHC =
+        [] : List Text
+    , LHC =
+        [] : List Text
+    , NHC =
+        [] : List Text
+    , UHC =
+        [] : List Text
+    , YHC =
+        [] : List Text
+    }
diff --git a/dhall/defaults/Executable.dhall b/dhall/defaults/Executable.dhall
--- a/dhall/defaults/Executable.dhall
+++ b/dhall/defaults/Executable.dhall
@@ -1,4 +1,4 @@
 -- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).
 let types = ./../types.dhall
 
-in  ././BuildInfo.dhall ⫽ { scope = types.Scope.Public {=} }
+in  ././BuildInfo.dhall ⫽ { scope = types.Scope.Public }
diff --git a/dhall/defaults/Library.dhall b/dhall/defaults/Library.dhall
--- a/dhall/defaults/Library.dhall
+++ b/dhall/defaults/Library.dhall
@@ -1,10 +1,16 @@
 -- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).
-  ././BuildInfo.dhall
-⫽ { exposed-modules =
-      [] : List Text
-  , reexported-modules =
-      [] : List
-           { name : Text, original : { name : Text, package : Optional Text } }
-  , signatures =
-      [] : List Text
-  }
+let types = ./../types.dhall
+
+in    ././BuildInfo.dhall
+    ⫽ { exposed-modules =
+          [] : List Text
+      , reexported-modules =
+          [] : List
+               { name :
+                   Text
+               , original :
+                   { name : Text, package : Optional Text }
+               }
+      , signatures =
+          [] : List Text
+      }
diff --git a/dhall/defaults/Package.dhall b/dhall/defaults/Package.dhall
--- a/dhall/defaults/Package.dhall
+++ b/dhall/defaults/Package.dhall
@@ -54,7 +54,7 @@
     , library =
         None (∀(config : types.Config) → types.Library)
     , license =
-        types.License.AllRightsReserved {=}
+        types.License.AllRightsReserved
     , license-files =
         [] : List Text
     , maintainer =
diff --git a/dhall/defaults/SourceRepo.dhall b/dhall/defaults/SourceRepo.dhall
--- a/dhall/defaults/SourceRepo.dhall
+++ b/dhall/defaults/SourceRepo.dhall
@@ -14,5 +14,5 @@
     , subdir =
         None Text
     , kind =
-        types.RepoKind.RepoHead {=}
+        types.RepoKind.RepoHead
     }
diff --git a/dhall/defaults/TestSuite.dhall b/dhall/defaults/TestSuite.dhall
--- a/dhall/defaults/TestSuite.dhall
+++ b/dhall/defaults/TestSuite.dhall
@@ -1,2 +1,2 @@
 -- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).
-././BuildInfo.dhall
+let types = ./../types.dhall in ././BuildInfo.dhall
diff --git a/dhall/types/Arch.dhall b/dhall/types/Arch.dhall
--- a/dhall/types/Arch.dhall
+++ b/dhall/types/Arch.dhall
@@ -1,37 +1,20 @@
-< AArch64 :
-    {}
-| Alpha :
-    {}
-| Arm :
-    {}
-| Hppa :
-    {}
-| I386 :
-    {}
-| IA64 :
-    {}
-| JavaScript :
-    {}
-| M68k :
-    {}
-| Mips :
-    {}
+< AArch64
+| Alpha
+| Arm
+| Hppa
+| I386
+| IA64
+| JavaScript
+| M68k
+| Mips
 | OtherArch :
     { _1 : Text }
-| PPC :
-    {}
-| PPC64 :
-    {}
-| Rs6000 :
-    {}
-| S390 :
-    {}
-| SH :
-    {}
-| Sparc :
-    {}
-| Vax :
-    {}
-| X86_64 :
-    {}
+| PPC
+| PPC64
+| Rs6000
+| S390
+| SH
+| Sparc
+| Vax
+| X86_64
 >
diff --git a/dhall/types/BuildType.dhall b/dhall/types/BuildType.dhall
--- a/dhall/types/BuildType.dhall
+++ b/dhall/types/BuildType.dhall
@@ -1,1 +1,1 @@
-< Configure : {} | Custom : {} | Make : {} | Simple : {} >
+< Configure | Custom | Make | Simple >
diff --git a/dhall/types/Compiler.dhall b/dhall/types/Compiler.dhall
--- a/dhall/types/Compiler.dhall
+++ b/dhall/types/Compiler.dhall
@@ -1,27 +1,16 @@
-< Eta :
-    {}
-| GHC :
-    {}
-| GHCJS :
-    {}
-| HBC :
-    {}
+< Eta
+| GHC
+| GHCJS
+| HBC
 | HaskellSuite :
     { _1 : Text }
-| Helium :
-    {}
-| Hugs :
-    {}
-| JHC :
-    {}
-| LHC :
-    {}
-| NHC :
-    {}
+| Helium
+| Hugs
+| JHC
+| LHC
+| NHC
 | OtherCompiler :
     { _1 : Text }
-| UHC :
-    {}
-| YHC :
-    {}
+| UHC
+| YHC
 >
diff --git a/dhall/types/ForeignLibrary.dhall b/dhall/types/ForeignLibrary.dhall
--- a/dhall/types/ForeignLibrary.dhall
+++ b/dhall/types/ForeignLibrary.dhall
@@ -1,10 +1,10 @@
   ./BuildInfo.dhall
 ⩓ { type :
-      < Shared : {} | Static : {} >
+      < Shared | Static >
   , options :
-      List < Standalone : {} >
+      List < Standalone >
   , lib-version-info :
-      Optional { age : Natural, current : Natural, revision : Natural }
+      Optional { current : Natural, revision : Natural, age : Natural }
   , lib-version-linux :
       Optional ./Version.dhall
   , mod-def-files :
diff --git a/dhall/types/Language.dhall b/dhall/types/Language.dhall
--- a/dhall/types/Language.dhall
+++ b/dhall/types/Language.dhall
@@ -1,1 +1,1 @@
-< Haskell2010 : {} | Haskell98 : {} | UnknownLanguage : { _1 : Text } >
+< Haskell2010 | Haskell98 | UnknownLanguage : { _1 : Text } >
diff --git a/dhall/types/License.dhall b/dhall/types/License.dhall
--- a/dhall/types/License.dhall
+++ b/dhall/types/License.dhall
@@ -1,33 +1,24 @@
-< AGPL :
-    Optional ./Version.dhall
-| AllRightsReserved :
-    {}
-| Apache :
+< GPL :
     Optional ./Version.dhall
-| BSD2 :
-    {}
-| BSD3 :
-    {}
-| BSD4 :
-    {}
-| GPL :
+| AGPL :
     Optional ./Version.dhall
-| ISC :
-    {}
 | LGPL :
     Optional ./Version.dhall
-| MIT :
-    {}
+| BSD2
+| BSD3
+| BSD4
+| MIT
+| ISC
 | MPL :
     ./Version.dhall
-| Other :
-    {}
-| PublicDomain :
-    {}
-| Unspecified :
-    {}
+| Apache :
+    Optional ./Version.dhall
+| PublicDomain
+| AllRightsReserved
+| Unspecified
 | Unknown :
     Text
+| Other
 | SPDX :
     ./SPDX.dhall
 >
diff --git a/dhall/types/ModuleRenaming.dhall b/dhall/types/ModuleRenaming.dhall
--- a/dhall/types/ModuleRenaming.dhall
+++ b/dhall/types/ModuleRenaming.dhall
@@ -1,7 +1,1 @@
-< renaming :
-    List { rename : Text, to : Text }
-| default :
-    {}
-| hiding :
-    List Text
->
+< renaming : List { rename : Text, to : Text } | default | hiding : List Text >
diff --git a/dhall/types/OS.dhall b/dhall/types/OS.dhall
--- a/dhall/types/OS.dhall
+++ b/dhall/types/OS.dhall
@@ -1,35 +1,19 @@
-< AIX :
-    {}
-| Android :
-    {}
-| DragonFly :
-    {}
-| FreeBSD :
-    {}
-| Ghcjs :
-    {}
-| HPUX :
-    {}
-| HaLVM :
-    {}
-| Hurd :
-    {}
-| IOS :
-    {}
-| IRIX :
-    {}
-| Linux :
-    {}
-| NetBSD :
-    {}
-| OSX :
-    {}
-| OpenBSD :
-    {}
+< AIX
+| Android
+| DragonFly
+| FreeBSD
+| Ghcjs
+| HPUX
+| HaLVM
+| Hurd
+| IOS
+| IRIX
+| Linux
+| NetBSD
+| OSX
+| OpenBSD
 | OtherOS :
     { _1 : Text }
-| Solaris :
-    {}
-| Windows :
-    {}
+| Solaris
+| Windows
 >
diff --git a/dhall/types/RepoKind.dhall b/dhall/types/RepoKind.dhall
--- a/dhall/types/RepoKind.dhall
+++ b/dhall/types/RepoKind.dhall
@@ -1,1 +1,1 @@
-< RepoHead : {} | RepoKindUnknown : { _1 : Text } | RepoThis : {} >
+< RepoHead | RepoKindUnknown : { _1 : Text } | RepoThis >
diff --git a/dhall/types/RepoType.dhall b/dhall/types/RepoType.dhall
--- a/dhall/types/RepoType.dhall
+++ b/dhall/types/RepoType.dhall
@@ -1,19 +1,11 @@
-< Bazaar :
-    {}
-| CVS :
-    {}
-| Darcs :
-    {}
-| Git :
-    {}
-| GnuArch :
-    {}
-| Mercurial :
-    {}
-| Monotone :
-    {}
+< Bazaar
+| CVS
+| Darcs
+| Git
+| GnuArch
+| Mercurial
+| Monotone
 | OtherRepoType :
     { _1 : Text }
-| SVN :
-    {}
+| SVN
 >
diff --git a/dhall/types/SPDX/LicenseExceptionId.dhall b/dhall/types/SPDX/LicenseExceptionId.dhall
--- a/dhall/types/SPDX/LicenseExceptionId.dhall
+++ b/dhall/types/SPDX/LicenseExceptionId.dhall
@@ -1,65 +1,33 @@
-< DS389_exception :
-    {}
-| Autoconf_exception_2_0 :
-    {}
-| Autoconf_exception_3_0 :
-    {}
-| Bison_exception_2_2 :
-    {}
-| Bootloader_exception :
-    {}
-| Classpath_exception_2_0 :
-    {}
-| CLISP_exception_2_0 :
-    {}
-| DigiRule_FOSS_exception :
-    {}
-| ECos_exception_2_0 :
-    {}
-| Fawkes_Runtime_exception :
-    {}
-| FLTK_exception :
-    {}
-| Font_exception_2_0 :
-    {}
-| Freertos_exception_2_0 :
-    {}
-| GCC_exception_2_0 :
-    {}
-| GCC_exception_3_1 :
-    {}
-| Gnu_javamail_exception :
-    {}
-| I2p_gpl_java_exception :
-    {}
-| Libtool_exception :
-    {}
-| Linux_syscall_note :
-    {}
-| LLVM_exception :
-    {}
-| LZMA_exception :
-    {}
-| Mif_exception :
-    {}
-| Nokia_Qt_exception_1_1 :
-    {}
-| OCCT_exception_1_0 :
-    {}
-| OpenJDK_assembly_exception_1_0 :
-    {}
-| Openvpn_openssl_exception :
-    {}
-| PS_or_PDF_font_exception_20170817 :
-    {}
-| Qt_GPL_exception_1_0 :
-    {}
-| Qt_LGPL_exception_1_1 :
-    {}
-| Qwt_exception_1_0 :
-    {}
-| U_boot_exception_2_0 :
-    {}
-| WxWindows_exception_3_1 :
-    {}
+< DS389_exception
+| Autoconf_exception_2_0
+| Autoconf_exception_3_0
+| Bison_exception_2_2
+| Bootloader_exception
+| Classpath_exception_2_0
+| CLISP_exception_2_0
+| DigiRule_FOSS_exception
+| ECos_exception_2_0
+| Fawkes_Runtime_exception
+| FLTK_exception
+| Font_exception_2_0
+| Freertos_exception_2_0
+| GCC_exception_2_0
+| GCC_exception_3_1
+| Gnu_javamail_exception
+| I2p_gpl_java_exception
+| Libtool_exception
+| Linux_syscall_note
+| LLVM_exception
+| LZMA_exception
+| Mif_exception
+| Nokia_Qt_exception_1_1
+| OCCT_exception_1_0
+| OpenJDK_assembly_exception_1_0
+| Openvpn_openssl_exception
+| PS_or_PDF_font_exception_20170817
+| Qt_GPL_exception_1_0
+| Qt_LGPL_exception_1_1
+| Qwt_exception_1_0
+| U_boot_exception_2_0
+| WxWindows_exception_3_1
 >
diff --git a/dhall/types/SPDX/LicenseId.dhall b/dhall/types/SPDX/LicenseId.dhall
--- a/dhall/types/SPDX/LicenseId.dhall
+++ b/dhall/types/SPDX/LicenseId.dhall
@@ -1,699 +1,350 @@
-< NullBSD :
-    {}
-| AAL :
-    {}
-| Adobe_2006 :
-    {}
-| Adobe_Glyph :
-    {}
-| Abstyles :
-    {}
-| ADSL :
-    {}
-| AFL_1_1 :
-    {}
-| AFL_2_0 :
-    {}
-| AFL_2_1 :
-    {}
-| AFL_1_2 :
-    {}
-| AFL_3_0 :
-    {}
-| Afmparse :
-    {}
-| AGPL_1_0_only :
-    {}
-| AGPL_1_0_or_later :
-    {}
-| AGPL_1_0 :
-    {}
-| AGPL_3_0_or_later :
-    {}
-| Aladdin :
-    {}
-| AGPL_3_0_only :
-    {}
-| AML :
-    {}
-| AMPAS :
-    {}
-| AMDPLPA :
-    {}
-| ANTLR_PD :
-    {}
-| Apache_1_0 :
-    {}
-| Apache_2_0 :
-    {}
-| APAFML :
-    {}
-| Apache_1_1 :
-    {}
-| APSL_1_0 :
-    {}
-| APSL_1_1 :
-    {}
-| APL_1_0 :
-    {}
-| APSL_2_0 :
-    {}
-| Artistic_1_0_cl8 :
-    {}
-| APSL_1_2 :
-    {}
-| Artistic_1_0_Perl :
-    {}
-| Artistic_1_0 :
-    {}
-| Bahyph :
-    {}
-| Barr :
-    {}
-| Artistic_2_0 :
-    {}
-| BitTorrent_1_0 :
-    {}
-| BitTorrent_1_1 :
-    {}
-| Beerware :
-    {}
-| BSD_1_Clause :
-    {}
-| BSD_2_Clause_FreeBSD :
-    {}
-| Borceux :
-    {}
-| BSD_2_Clause_NetBSD :
-    {}
-| BSD_2_Clause_Patent :
-    {}
-| BSD_3_Clause_Attribution :
-    {}
-| BSD_3_Clause_Clear :
-    {}
-| BSD_2_Clause :
-    {}
-| BSD_3_Clause_No_Nuclear_License_2014 :
-    {}
-| BSD_3_Clause_No_Nuclear_License :
-    {}
-| BSD_3_Clause_LBNL :
-    {}
-| BSD_3_Clause :
-    {}
-| BSD_4_Clause_UC :
-    {}
-| BSD_3_Clause_No_Nuclear_Warranty :
-    {}
-| BSD_4_Clause :
-    {}
-| BSD_Protection :
-    {}
-| BSL_1_0 :
-    {}
-| Bzip2_1_0_5 :
-    {}
-| BSD_Source_Code :
-    {}
-| Caldera :
-    {}
-| CATOSL_1_1 :
-    {}
-| Bzip2_1_0_6 :
-    {}
-| CC_BY_2_0 :
-    {}
-| CC_BY_2_5 :
-    {}
-| CC_BY_1_0 :
-    {}
-| CC_BY_3_0 :
-    {}
-| CC_BY_4_0 :
-    {}
-| CC_BY_NC_2_0 :
-    {}
-| CC_BY_NC_2_5 :
-    {}
-| CC_BY_NC_1_0 :
-    {}
-| CC_BY_NC_4_0 :
-    {}
-| CC_BY_NC_ND_1_0 :
-    {}
-| CC_BY_NC_3_0 :
-    {}
-| CC_BY_NC_ND_2_5 :
-    {}
-| CC_BY_NC_ND_3_0 :
-    {}
-| CC_BY_NC_ND_2_0 :
-    {}
-| CC_BY_NC_ND_4_0 :
-    {}
-| CC_BY_NC_SA_1_0 :
-    {}
-| CC_BY_NC_SA_2_5 :
-    {}
-| CC_BY_NC_SA_3_0 :
-    {}
-| CC_BY_NC_SA_2_0 :
-    {}
-| CC_BY_ND_1_0 :
-    {}
-| CC_BY_ND_2_0 :
-    {}
-| CC_BY_NC_SA_4_0 :
-    {}
-| CC_BY_ND_3_0 :
-    {}
-| CC_BY_ND_4_0 :
-    {}
-| CC_BY_ND_2_5 :
-    {}
-| CC_BY_SA_1_0 :
-    {}
-| CC_BY_SA_2_0 :
-    {}
-| CC_BY_SA_3_0 :
-    {}
-| CC_BY_SA_4_0 :
-    {}
-| CC_BY_SA_2_5 :
-    {}
-| CC0_1_0 :
-    {}
-| CDDL_1_0 :
-    {}
-| CDLA_Permissive_1_0 :
-    {}
-| CDLA_Sharing_1_0 :
-    {}
-| CDDL_1_1 :
-    {}
-| CECILL_1_0 :
-    {}
-| CECILL_1_1 :
-    {}
-| CECILL_2_1 :
-    {}
-| CECILL_B :
-    {}
-| CECILL_2_0 :
-    {}
-| ClArtistic :
-    {}
-| CNRI_Jython :
-    {}
-| CECILL_C :
-    {}
-| CNRI_Python :
-    {}
-| Condor_1_1 :
-    {}
-| CNRI_Python_GPL_Compatible :
-    {}
-| CPAL_1_0 :
-    {}
-| CPL_1_0 :
-    {}
-| Crossword :
-    {}
-| CrystalStacker :
-    {}
-| CPOL_1_02 :
-    {}
-| Cube :
-    {}
-| Curl :
-    {}
-| CUA_OPL_1_0 :
-    {}
-| Diffmark :
-    {}
-| DOC :
-    {}
-| D_FSL_1_0 :
-    {}
-| Dotseqn :
-    {}
-| DSDP :
-    {}
-| ECL_1_0 :
-    {}
-| ECL_2_0 :
-    {}
-| Dvipdfm :
-    {}
-| EFL_2_0 :
-    {}
-| EGenix :
-    {}
-| EFL_1_0 :
-    {}
-| EPL_1_0 :
-    {}
-| EPL_2_0 :
-    {}
-| Entessa :
-    {}
-| ErlPL_1_1 :
-    {}
-| EUDatagrid :
-    {}
-| EUPL_1_1 :
-    {}
-| EUPL_1_2 :
-    {}
-| EUPL_1_0 :
-    {}
-| Fair :
-    {}
-| Frameworx_1_0 :
-    {}
-| Eurosym :
-    {}
-| FSFAP :
-    {}
-| FSFUL :
-    {}
-| FreeImage :
-    {}
-| FSFULLR :
-    {}
-| FTL :
-    {}
-| GFDL_1_1_or_later :
-    {}
-| GFDL_1_2_only :
-    {}
-| GFDL_1_1_only :
-    {}
-| GFDL_1_3_only :
-    {}
-| GFDL_1_3_or_later :
-    {}
-| GFDL_1_2_or_later :
-    {}
-| GL2PS :
-    {}
-| Glide :
-    {}
-| Giftware :
-    {}
-| Glulxe :
-    {}
-| Gnuplot :
-    {}
-| GPL_1_0_or_later :
-    {}
-| GPL_2_0_only :
-    {}
-| GPL_1_0_only :
-    {}
-| GPL_3_0_only :
-    {}
-| GPL_3_0_or_later :
-    {}
-| GPL_2_0_or_later :
-    {}
-| HaskellReport :
-    {}
-| HPND :
-    {}
-| GSOAP_1_3b :
-    {}
-| IBM_pibs :
-    {}
-| ICU :
-    {}
-| ImageMagick :
-    {}
-| IMatix :
-    {}
-| IJG :
-    {}
-| Info_ZIP :
-    {}
-| Intel_ACPI :
-    {}
-| Imlib2 :
-    {}
-| Interbase_1_0 :
-    {}
-| IPA :
-    {}
-| Intel :
-    {}
-| IPL_1_0 :
-    {}
-| ISC :
-    {}
-| JSON :
-    {}
-| LAL_1_2 :
-    {}
-| JasPer_2_0 :
-    {}
-| LAL_1_3 :
-    {}
-| Latex2e :
-    {}
-| LGPL_2_0_only :
-    {}
-| LGPL_2_0_or_later :
-    {}
-| Leptonica :
-    {}
-| LGPL_2_1_only :
-    {}
-| LGPL_2_1_or_later :
-    {}
-| LGPL_3_0_or_later :
-    {}
-| LGPLLR :
-    {}
-| LGPL_3_0_only :
-    {}
-| Libtiff :
-    {}
-| LiLiQ_P_1_1 :
-    {}
-| Libpng :
-    {}
-| LiLiQ_Rplus_1_1 :
-    {}
-| Linux_OpenIB :
-    {}
-| LiLiQ_R_1_1 :
-    {}
-| LPL_1_0 :
-    {}
-| LPL_1_02 :
-    {}
-| LPPL_1_1 :
-    {}
-| LPPL_1_2 :
-    {}
-| LPPL_1_0 :
-    {}
-| LPPL_1_3c :
-    {}
-| MakeIndex :
-    {}
-| LPPL_1_3a :
-    {}
-| MIT_0 :
-    {}
-| MIT_advertising :
-    {}
-| MirOS :
-    {}
-| MIT_CMU :
-    {}
-| MIT_enna :
-    {}
-| MIT :
-    {}
-| MITNFA :
-    {}
-| MIT_feh :
-    {}
-| Mpich2 :
-    {}
-| MPL_1_0 :
-    {}
-| Motosoto :
-    {}
-| MPL_2_0_no_copyleft_exception :
-    {}
-| MPL_2_0 :
-    {}
-| MPL_1_1 :
-    {}
-| MS_PL :
-    {}
-| MS_RL :
-    {}
-| Multics :
-    {}
-| Mup :
-    {}
-| MTLL :
-    {}
-| Naumen :
-    {}
-| NBPL_1_0 :
-    {}
-| NASA_1_3 :
-    {}
-| Net_SNMP :
-    {}
-| NetCDF :
-    {}
-| NCSA :
-    {}
-| Newsletr :
-    {}
-| NGPL :
-    {}
-| NLPL :
-    {}
-| Nokia :
-    {}
-| NLOD_1_0 :
-    {}
-| Noweb :
-    {}
-| NPL_1_0 :
-    {}
-| NOSL :
-    {}
-| NPOSL_3_0 :
-    {}
-| NRL :
-    {}
-| NPL_1_1 :
-    {}
-| NTP :
-    {}
-| OCCT_PL :
-    {}
-| ODbL_1_0 :
-    {}
-| ODC_By_1_0 :
-    {}
-| OCLC_2_0 :
-    {}
-| OFL_1_1 :
-    {}
-| OGTSL :
-    {}
-| OFL_1_0 :
-    {}
-| OLDAP_1_2 :
-    {}
-| OLDAP_1_3 :
-    {}
-| OLDAP_1_1 :
-    {}
-| OLDAP_1_4 :
-    {}
-| OLDAP_2_0_1 :
-    {}
-| OLDAP_2_1 :
-    {}
-| OLDAP_2_2_1 :
-    {}
-| OLDAP_2_0 :
-    {}
-| OLDAP_2_2 :
-    {}
-| OLDAP_2_3 :
-    {}
-| OLDAP_2_2_2 :
-    {}
-| OLDAP_2_5 :
-    {}
-| OLDAP_2_6 :
-    {}
-| OLDAP_2_4 :
-    {}
-| OLDAP_2_7 :
-    {}
-| OLDAP_2_8 :
-    {}
-| OpenSSL :
-    {}
-| OPL_1_0 :
-    {}
-| OML :
-    {}
-| OSL_1_0 :
-    {}
-| OSL_1_1 :
-    {}
-| OSET_PL_2_1 :
-    {}
-| OSL_2_1 :
-    {}
-| OSL_3_0 :
-    {}
-| OSL_2_0 :
-    {}
-| PDDL_1_0 :
-    {}
-| PHP_3_0 :
-    {}
-| Plexus :
-    {}
-| PostgreSQL :
-    {}
-| PHP_3_01 :
-    {}
-| Psutils :
-    {}
-| Python_2_0 :
-    {}
-| Psfrag :
-    {}
-| QPL_1_0 :
-    {}
-| Rdisc :
-    {}
-| Qhull :
-    {}
-| RHeCos_1_1 :
-    {}
-| RPL_1_1 :
-    {}
-| RPSL_1_0 :
-    {}
-| RSA_MD :
-    {}
-| RPL_1_5 :
-    {}
-| Ruby :
-    {}
-| SAX_PD :
-    {}
-| RSCPL :
-    {}
-| SCEA :
-    {}
-| Sendmail :
-    {}
-| Saxpath :
-    {}
-| SGI_B_1_0 :
-    {}
-| SGI_B_1_1 :
-    {}
-| SimPL_2_0 :
-    {}
-| SISSL_1_2 :
-    {}
-| SGI_B_2_0 :
-    {}
-| Sleepycat :
-    {}
-| SMLNJ :
-    {}
-| SISSL :
-    {}
-| SNIA :
-    {}
-| Spencer_86 :
-    {}
-| SMPPL :
-    {}
-| Spencer_94 :
-    {}
-| Spencer_99 :
-    {}
-| SugarCRM_1_1_3 :
-    {}
-| SWL :
-    {}
-| SPL_1_0 :
-    {}
-| TCP_wrappers :
-    {}
-| TMate :
-    {}
-| TCL :
-    {}
-| TOSL :
-    {}
-| TU_Berlin_1_0 :
-    {}
-| TORQUE_1_1 :
-    {}
-| TU_Berlin_2_0 :
-    {}
-| Unicode_DFS_2015 :
-    {}
-| Unicode_TOU :
-    {}
-| Unlicense :
-    {}
-| Unicode_DFS_2016 :
-    {}
-| Vim :
-    {}
-| VOSTROM :
-    {}
-| UPL_1_0 :
-    {}
-| W3C_19980720 :
-    {}
-| W3C_20150513 :
-    {}
-| VSL_1_0 :
-    {}
-| W3C :
-    {}
-| Watcom_1_0 :
-    {}
-| WTFPL :
-    {}
-| X11 :
-    {}
-| Wsuipa :
-    {}
-| XFree86_1_1 :
-    {}
-| Xinetd :
-    {}
-| Xerox :
-    {}
-| Xpp :
-    {}
-| XSkat :
-    {}
-| Xnet :
-    {}
-| YPL_1_0 :
-    {}
-| YPL_1_1 :
-    {}
-| Zend_2_0 :
-    {}
-| Zimbra_1_3 :
-    {}
-| Zed :
-    {}
-| Zlib_acknowledgement :
-    {}
-| Zlib :
-    {}
-| Zimbra_1_4 :
-    {}
-| ZPL_2_0 :
-    {}
-| ZPL_2_1 :
-    {}
-| ZPL_1_1 :
-    {}
+< NullBSD
+| AAL
+| Abstyles
+| Adobe_2006
+| Adobe_Glyph
+| ADSL
+| AFL_1_1
+| AFL_1_2
+| AFL_2_0
+| AFL_2_1
+| AFL_3_0
+| Afmparse
+| AGPL_1_0
+| AGPL_1_0_only
+| AGPL_1_0_or_later
+| AGPL_3_0_only
+| AGPL_3_0_or_later
+| Aladdin
+| AMDPLPA
+| AML
+| AMPAS
+| ANTLR_PD
+| Apache_1_0
+| Apache_1_1
+| Apache_2_0
+| APAFML
+| APL_1_0
+| APSL_1_0
+| APSL_1_1
+| APSL_1_2
+| APSL_2_0
+| Artistic_1_0_cl8
+| Artistic_1_0_Perl
+| Artistic_1_0
+| Artistic_2_0
+| Bahyph
+| Barr
+| Beerware
+| BitTorrent_1_0
+| BitTorrent_1_1
+| Borceux
+| BSD_1_Clause
+| BSD_2_Clause_FreeBSD
+| BSD_2_Clause_NetBSD
+| BSD_2_Clause_Patent
+| BSD_2_Clause
+| BSD_3_Clause_Attribution
+| BSD_3_Clause_Clear
+| BSD_3_Clause_LBNL
+| BSD_3_Clause_No_Nuclear_License_2014
+| BSD_3_Clause_No_Nuclear_License
+| BSD_3_Clause_No_Nuclear_Warranty
+| BSD_3_Clause
+| BSD_4_Clause_UC
+| BSD_4_Clause
+| BSD_Protection
+| BSD_Source_Code
+| BSL_1_0
+| Bzip2_1_0_5
+| Bzip2_1_0_6
+| Caldera
+| CATOSL_1_1
+| CC_BY_1_0
+| CC_BY_2_0
+| CC_BY_2_5
+| CC_BY_3_0
+| CC_BY_4_0
+| CC_BY_NC_1_0
+| CC_BY_NC_2_0
+| CC_BY_NC_2_5
+| CC_BY_NC_3_0
+| CC_BY_NC_4_0
+| CC_BY_NC_ND_1_0
+| CC_BY_NC_ND_2_0
+| CC_BY_NC_ND_2_5
+| CC_BY_NC_ND_3_0
+| CC_BY_NC_ND_4_0
+| CC_BY_NC_SA_1_0
+| CC_BY_NC_SA_2_0
+| CC_BY_NC_SA_2_5
+| CC_BY_NC_SA_3_0
+| CC_BY_NC_SA_4_0
+| CC_BY_ND_1_0
+| CC_BY_ND_2_0
+| CC_BY_ND_2_5
+| CC_BY_ND_3_0
+| CC_BY_ND_4_0
+| CC_BY_SA_1_0
+| CC_BY_SA_2_0
+| CC_BY_SA_2_5
+| CC_BY_SA_3_0
+| CC_BY_SA_4_0
+| CC0_1_0
+| CDDL_1_0
+| CDDL_1_1
+| CDLA_Permissive_1_0
+| CDLA_Sharing_1_0
+| CECILL_1_0
+| CECILL_1_1
+| CECILL_2_0
+| CECILL_2_1
+| CECILL_B
+| CECILL_C
+| ClArtistic
+| CNRI_Jython
+| CNRI_Python_GPL_Compatible
+| CNRI_Python
+| Condor_1_1
+| CPAL_1_0
+| CPL_1_0
+| CPOL_1_02
+| Crossword
+| CrystalStacker
+| CUA_OPL_1_0
+| Cube
+| Curl
+| D_FSL_1_0
+| Diffmark
+| DOC
+| Dotseqn
+| DSDP
+| Dvipdfm
+| ECL_1_0
+| ECL_2_0
+| EFL_1_0
+| EFL_2_0
+| EGenix
+| Entessa
+| EPL_1_0
+| EPL_2_0
+| ErlPL_1_1
+| EUDatagrid
+| EUPL_1_0
+| EUPL_1_1
+| EUPL_1_2
+| Eurosym
+| Fair
+| Frameworx_1_0
+| FreeImage
+| FSFAP
+| FSFUL
+| FSFULLR
+| FTL
+| GFDL_1_1_only
+| GFDL_1_1_or_later
+| GFDL_1_2_only
+| GFDL_1_2_or_later
+| GFDL_1_3_only
+| GFDL_1_3_or_later
+| Giftware
+| GL2PS
+| Glide
+| Glulxe
+| Gnuplot
+| GPL_1_0_only
+| GPL_1_0_or_later
+| GPL_2_0_only
+| GPL_2_0_or_later
+| GPL_3_0_only
+| GPL_3_0_or_later
+| GSOAP_1_3b
+| HaskellReport
+| HPND
+| IBM_pibs
+| ICU
+| IJG
+| ImageMagick
+| IMatix
+| Imlib2
+| Info_ZIP
+| Intel_ACPI
+| Intel
+| Interbase_1_0
+| IPA
+| IPL_1_0
+| ISC
+| JasPer_2_0
+| JSON
+| LAL_1_2
+| LAL_1_3
+| Latex2e
+| Leptonica
+| LGPL_2_0_only
+| LGPL_2_0_or_later
+| LGPL_2_1_only
+| LGPL_2_1_or_later
+| LGPL_3_0_only
+| LGPL_3_0_or_later
+| LGPLLR
+| Libpng
+| Libtiff
+| LiLiQ_P_1_1
+| LiLiQ_R_1_1
+| LiLiQ_Rplus_1_1
+| Linux_OpenIB
+| LPL_1_0
+| LPL_1_02
+| LPPL_1_0
+| LPPL_1_1
+| LPPL_1_2
+| LPPL_1_3a
+| LPPL_1_3c
+| MakeIndex
+| MirOS
+| MIT_0
+| MIT_advertising
+| MIT_CMU
+| MIT_enna
+| MIT_feh
+| MIT
+| MITNFA
+| Motosoto
+| Mpich2
+| MPL_1_0
+| MPL_1_1
+| MPL_2_0_no_copyleft_exception
+| MPL_2_0
+| MS_PL
+| MS_RL
+| MTLL
+| Multics
+| Mup
+| NASA_1_3
+| Naumen
+| NBPL_1_0
+| NCSA
+| Net_SNMP
+| NetCDF
+| Newsletr
+| NGPL
+| NLOD_1_0
+| NLPL
+| Nokia
+| NOSL
+| Noweb
+| NPL_1_0
+| NPL_1_1
+| NPOSL_3_0
+| NRL
+| NTP
+| OCCT_PL
+| OCLC_2_0
+| ODbL_1_0
+| ODC_By_1_0
+| OFL_1_0
+| OFL_1_1
+| OGTSL
+| OLDAP_1_1
+| OLDAP_1_2
+| OLDAP_1_3
+| OLDAP_1_4
+| OLDAP_2_0_1
+| OLDAP_2_0
+| OLDAP_2_1
+| OLDAP_2_2_1
+| OLDAP_2_2_2
+| OLDAP_2_2
+| OLDAP_2_3
+| OLDAP_2_4
+| OLDAP_2_5
+| OLDAP_2_6
+| OLDAP_2_7
+| OLDAP_2_8
+| OML
+| OpenSSL
+| OPL_1_0
+| OSET_PL_2_1
+| OSL_1_0
+| OSL_1_1
+| OSL_2_0
+| OSL_2_1
+| OSL_3_0
+| PDDL_1_0
+| PHP_3_0
+| PHP_3_01
+| Plexus
+| PostgreSQL
+| Psfrag
+| Psutils
+| Python_2_0
+| Qhull
+| QPL_1_0
+| Rdisc
+| RHeCos_1_1
+| RPL_1_1
+| RPL_1_5
+| RPSL_1_0
+| RSA_MD
+| RSCPL
+| Ruby
+| SAX_PD
+| Saxpath
+| SCEA
+| Sendmail
+| SGI_B_1_0
+| SGI_B_1_1
+| SGI_B_2_0
+| SimPL_2_0
+| SISSL_1_2
+| SISSL
+| Sleepycat
+| SMLNJ
+| SMPPL
+| SNIA
+| Spencer_86
+| Spencer_94
+| Spencer_99
+| SPL_1_0
+| SugarCRM_1_1_3
+| SWL
+| TCL
+| TCP_wrappers
+| TMate
+| TORQUE_1_1
+| TOSL
+| TU_Berlin_1_0
+| TU_Berlin_2_0
+| Unicode_DFS_2015
+| Unicode_DFS_2016
+| Unicode_TOU
+| Unlicense
+| UPL_1_0
+| Vim
+| VOSTROM
+| VSL_1_0
+| W3C_19980720
+| W3C_20150513
+| W3C
+| Watcom_1_0
+| Wsuipa
+| WTFPL
+| X11
+| Xerox
+| XFree86_1_1
+| Xinetd
+| Xnet
+| Xpp
+| XSkat
+| YPL_1_0
+| YPL_1_1
+| Zed
+| Zend_2_0
+| Zimbra_1_3
+| Zimbra_1_4
+| Zlib_acknowledgement
+| Zlib
+| ZPL_1_1
+| ZPL_2_0
+| ZPL_2_1
 >
diff --git a/dhall/types/Scope.dhall b/dhall/types/Scope.dhall
--- a/dhall/types/Scope.dhall
+++ b/dhall/types/Scope.dhall
@@ -1,1 +1,1 @@
-< Public : {} | Private : {} >
+< Public | Private >
diff --git a/dhall/utils/GitHub-project.dhall b/dhall/utils/GitHub-project.dhall
--- a/dhall/utils/GitHub-project.dhall
+++ b/dhall/utils/GitHub-project.dhall
@@ -16,7 +16,7 @@
                     ⫽ { location =
                           Some gitHubRoot
                       , type =
-                          Some ((../types/RepoType.dhall).Git {=})
+                          Some (../types/RepoType.dhall).Git
                       }
                   ]
               }
diff --git a/exe/Main.hs b/exe/Main.hs
--- a/exe/Main.hs
+++ b/exe/Main.hs
@@ -1,3 +1,4 @@
+{-# language LambdaCase #-}
 {-# language NoMonomorphismRestriction #-}
 {-# language NamedFieldPuns #-}
 {-# language OverloadedStrings #-}
@@ -32,6 +33,7 @@
 import DhallToCabal.Util ( relativeTo )
 import qualified Paths_dhall_to_cabal as Paths
 
+import qualified Data.List.NonEmpty as NonEmpty
 import qualified Data.Text.IO as StrictText
 import qualified Data.Text.Prettyprint.Doc as Pretty
 import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty
@@ -82,6 +84,8 @@
   | SPDX
   | LicenseId
   | LicenseExceptionId
+  | Scope
+  | ModuleRenaming
   deriving (Bounded, Enum, Eq, Ord, Read, Show)
 
 
@@ -410,7 +414,18 @@
     <*> f root
 
 
+addBinding :: Text -> Dhall.Expr s a -> Dhall.Expr s a -> Dhall.Expr s a
+addBinding name val = \case
+  Expr.Let bindings body ->
+    Expr.Let
+      ( Expr.Binding name Nothing val `NonEmpty.cons` bindings )
+      body
+  expr ->
+    Expr.Let
+      ( Expr.Binding name Nothing val :| [] )
+      expr
 
+
 printType :: PrintTypeOptions -> IO ()
 printType PrintTypeOptions { .. } = do
   Pretty.renderIO
@@ -450,6 +465,8 @@
           SPDX -> Dhall.expected spdxLicense
           LicenseId -> Dhall.expected spdxLicenseId
           LicenseExceptionId -> Dhall.expected spdxLicenseExceptionId
+          Scope -> Dhall.expected executableScope
+          ModuleRenaming -> Dhall.expected moduleRenaming
       )
 
     makeLetOrImport t val reduced =
@@ -457,7 +474,7 @@
         name = fromString ( show t )
       in if shouldBeImported t && not selfContained
          then Dhall.subst ( Expr.V name 0 ) ( Expr.Var ( Expr.V "types" 0 ) `Expr.Field` name ) reduced
-         else Expr.Let (Expr.Binding name Nothing val :| []) reduced
+         else addBinding name val reduced
 
     factoredType :: Expr.Expr Dhall.Parser.Src Dhall.Import
     factoredType =
@@ -465,19 +482,15 @@
         initialState :: CSEState Dhall.Import
         initialState = CSEState mempty ( dhallType typeToPrint )
 
-        CSEState types expr =
+        CSEState types body =
           execState
             ( traverse_ step [ minBound .. maxBound ] )
             initialState
 
-        -- Note: right fold here, though the above traversal is a left
-        -- fold. We need the types we factor out last to be the
-        -- outermost-bound.
-        body = foldr ( uncurry makeLetOrImport ) expr types
-
         importing = if any shouldBeImported ( fst <$> types ) && not selfContained
-          then Expr.Let
-                 ( Expr.Binding "types" Nothing ( Expr.Embed ( typesLocation dhallFromGitHub ) ) :| [] )
+          then addBinding
+                 "types"
+                 ( Expr.Embed ( typesLocation dhallFromGitHub ) )
           else id
 
       in
@@ -509,7 +522,11 @@
         case liftCSE subrecord name ( dhallType factorType ) expr of
           Just expr' -> do
             tell (Any True)
-            return expr'
+            -- Note that the substitution/binding only happens in this
+            -- branch, rather than the branch where no expression was
+            -- lifted out - otherwise, as the variables aren't shifted
+            -- in the latter case, we can get into trouble.
+            return $ makeLetOrImport factorType ( dhallType factorType ) expr'
           Nothing ->
             return expr
 
@@ -668,17 +685,14 @@
           Expr.RecordLit <$> traverse ( `go` v ) fields
 
         Expr.Union fields ->
-          Expr.Union <$> traverse ( `go` v ) fields
+          Expr.Union <$> traverse ( traverse ( `go` v ) ) fields
 
         Expr.UnionLit n a fields ->
-          Expr.UnionLit n <$> go a v <*> traverse ( `go` v ) fields
+          Expr.UnionLit n <$> go a v <*> traverse ( traverse ( `go` v ) ) fields
 
         Expr.Merge a b t ->
           Expr.Merge <$> go a v <*> go b v <*> traverse ( `go` v ) t
 
-        Expr.Constructors e ->
-          Expr.Constructors <$> go e v
-
         Expr.Field e f ->
           Expr.Field <$> go e v <*> pure f
 
@@ -763,6 +777,9 @@
         Expr.TextLit{} ->
           pure e
 
+        Expr.TextShow ->
+          pure e
+
         Expr.List ->
           pure e
 
@@ -814,8 +831,9 @@
 
   where
     withPreludeImport =
-      Expr.Let (Expr.Binding "prelude" Nothing
-                  ( Expr.Embed ( preludeLocation dhallFromGitHub ) ) :| [])
+      addBinding
+        "prelude"
+        ( Expr.Embed ( preludeLocation dhallFromGitHub ) )
 
     expr :: Expr.Expr Dhall.Parser.Src Dhall.Import
     expr = getDefault
diff --git a/golden-tests/cabal-to-dhall/SPDX.dhall b/golden-tests/cabal-to-dhall/SPDX.dhall
--- a/golden-tests/cabal-to-dhall/SPDX.dhall
+++ b/golden-tests/cabal-to-dhall/SPDX.dhall
@@ -12,11 +12,11 @@
           ( prelude.SPDX.and
             ( prelude.SPDX.or
               ( prelude.SPDX.license
-                (types.LicenseId.AGPL_3_0_or_later {=})
-                (Some (types.LicenseExceptionId.Classpath_exception_2_0 {=}))
+                types.LicenseId.AGPL_3_0_or_later
+                (Some types.LicenseExceptionId.Classpath_exception_2_0)
               )
               ( prelude.SPDX.licenseVersionOrLater
-                (types.LicenseId.Apache_2_0 {=})
+                types.LicenseId.Apache_2_0
                 (None types.LicenseExceptionId)
               )
             )
diff --git a/golden-tests/cabal-to-dhall/conditional-dependencies.dhall b/golden-tests/cabal-to-dhall/conditional-dependencies.dhall
--- a/golden-tests/cabal-to-dhall/conditional-dependencies.dhall
+++ b/golden-tests/cabal-to-dhall/conditional-dependencies.dhall
@@ -13,14 +13,14 @@
           Some
           (   λ(config : types.Config)
             →       if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        ( prelude.unionVersionRanges
                          (prelude.thisVersion (prelude.v "8.2"))
                          (prelude.laterVersion (prelude.v "8.2"))
                        )
               
               then        if config.impl
-                             (types.Compiler.GHC {=})
+                             types.Compiler.GHC
                              ( prelude.unionVersionRanges
                                (prelude.thisVersion (prelude.v "8.4"))
                                (prelude.laterVersion (prelude.v "8.4"))
@@ -42,7 +42,7 @@
                             }
               
               else  if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        ( prelude.unionVersionRanges
                          (prelude.thisVersion (prelude.v "8.4"))
                          (prelude.laterVersion (prelude.v "8.4"))
@@ -61,5 +61,5 @@
                       }
           )
       , license =
-          types.License.Unspecified {=}
+          types.License.Unspecified
       }
diff --git a/golden-tests/cabal-to-dhall/gh-36.dhall b/golden-tests/cabal-to-dhall/gh-36.dhall
--- a/golden-tests/cabal-to-dhall/gh-36.dhall
+++ b/golden-tests/cabal-to-dhall/gh-36.dhall
@@ -24,18 +24,18 @@
           Some
           (   λ(config : types.Config)
             →       if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        ( prelude.unionVersionRanges
                          (prelude.thisVersion (prelude.v "0.0.9.7"))
                          (prelude.laterVersion (prelude.v "0.0.9.7"))
                        )
               
               then        if config.impl
-                             (types.Compiler.GHC {=})
+                             types.Compiler.GHC
                              (prelude.earlierVersion (prelude.v "0.7.0.2"))
                     
                     then        if config.impl
-                                   (types.Compiler.GHC {=})
+                                   types.Compiler.GHC
                                    ( prelude.unionVersionRanges
                                      (prelude.thisVersion (prelude.v "0.0.9"))
                                      (prelude.laterVersion (prelude.v "0.0.9"))
@@ -76,7 +76,7 @@
                                   }
                     
                     else  if config.impl
-                             (types.Compiler.GHC {=})
+                             types.Compiler.GHC
                              ( prelude.unionVersionRanges
                                (prelude.thisVersion (prelude.v "0.0.9"))
                                (prelude.laterVersion (prelude.v "0.0.9"))
@@ -109,11 +109,11 @@
                           ⫽ { cpp-options = [ "-DINTEROP" ] }
               
               else  if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        (prelude.earlierVersion (prelude.v "0.7.0.2"))
               
               then        if config.impl
-                             (types.Compiler.GHC {=})
+                             types.Compiler.GHC
                              ( prelude.unionVersionRanges
                                (prelude.thisVersion (prelude.v "0.0.9"))
                                (prelude.laterVersion (prelude.v "0.0.9"))
@@ -148,7 +148,7 @@
                           ⫽ { cpp-options = [ "-DPURE_JAVA_WITH" ] }
               
               else  if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        ( prelude.unionVersionRanges
                          (prelude.thisVersion (prelude.v "0.0.9"))
                          (prelude.laterVersion (prelude.v "0.0.9"))
diff --git a/golden-tests/cabal-to-dhall/mixins-no-signatures.dhall b/golden-tests/cabal-to-dhall/mixins-no-signatures.dhall
--- a/golden-tests/cabal-to-dhall/mixins-no-signatures.dhall
+++ b/golden-tests/cabal-to-dhall/mixins-no-signatures.dhall
@@ -16,9 +16,9 @@
                           "foo"
                       , renaming =
                           { provides =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     , { package =
@@ -35,7 +35,7 @@
                               , { rename = "Third.Module", to = "Renamed" }
                               ]
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     , { package =
@@ -45,7 +45,7 @@
                               types.ModuleRenaming.hiding
                               [ "Hidden", "Also.Hidden" ]
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     ]
diff --git a/golden-tests/cabal-to-dhall/sourcerepo-defaults.dhall b/golden-tests/cabal-to-dhall/sourcerepo-defaults.dhall
--- a/golden-tests/cabal-to-dhall/sourcerepo-defaults.dhall
+++ b/golden-tests/cabal-to-dhall/sourcerepo-defaults.dhall
@@ -9,18 +9,14 @@
           prelude.v "0"
       , source-repos =
           [   prelude.defaults.SourceRepo
-            ⫽ { type =
-                  Some (types.RepoType.Git {=})
-              , location =
-                  Some "example.com"
-              }
+            ⫽ { type = Some types.RepoType.Git, location = Some "example.com" }
           ,   prelude.defaults.SourceRepo
             ⫽ { type =
-                  Some (types.RepoType.Darcs {=})
+                  Some types.RepoType.Darcs
               , location =
                   Some "example.org"
               , kind =
-                  types.RepoKind.RepoThis {=}
+                  types.RepoKind.RepoThis
               }
           ]
       }
diff --git a/golden-tests/cabal-to-dhall/unknown-license.cabal b/golden-tests/cabal-to-dhall/unknown-license.cabal
new file mode 100644
--- /dev/null
+++ b/golden-tests/cabal-to-dhall/unknown-license.cabal
@@ -0,0 +1,4 @@
+cabal-version: 1.12
+name: test
+version: 1.0
+license: MYUnknownLicense
diff --git a/golden-tests/cabal-to-dhall/unknown-license.dhall b/golden-tests/cabal-to-dhall/unknown-license.dhall
new file mode 100644
--- /dev/null
+++ b/golden-tests/cabal-to-dhall/unknown-license.dhall
@@ -0,0 +1,14 @@
+let prelude = ./../../dhall/prelude.dhall
+
+let types = ./../../dhall/types.dhall
+
+in    prelude.defaults.Package
+    ⫽ { name =
+          "test"
+      , version =
+          prelude.v "1.0"
+      , cabal-version =
+          prelude.v "1.12"
+      , license =
+          types.License.Unknown "MYUnknownLicense"
+      }
diff --git a/golden-tests/dhall-to-cabal/SPDX.dhall b/golden-tests/dhall-to-cabal/SPDX.dhall
--- a/golden-tests/dhall-to-cabal/SPDX.dhall
+++ b/golden-tests/dhall-to-cabal/SPDX.dhall
@@ -14,12 +14,12 @@
           ( prelude.SPDX.and
             ( prelude.SPDX.or
               ( prelude.SPDX.license
-                (types.LicenseId.AGPL_3_0_or_later {=})
+                types.LicenseId.AGPL_3_0_or_later
                 prelude.SPDX.noException
               )
               ( prelude.SPDX.licenseVersionOrLater
-                (types.LicenseId.Apache_2_0 {=})
-                (Some (types.LicenseExceptionId.Classpath_exception_2_0 {=}))
+                types.LicenseId.Apache_2_0
+                (Some types.LicenseExceptionId.Classpath_exception_2_0)
               )
             )
             ( prelude.SPDX.or
diff --git a/golden-tests/dhall-to-cabal/allrightsreserved-2.0.dhall b/golden-tests/dhall-to-cabal/allrightsreserved-2.0.dhall
--- a/golden-tests/dhall-to-cabal/allrightsreserved-2.0.dhall
+++ b/golden-tests/dhall-to-cabal/allrightsreserved-2.0.dhall
@@ -10,7 +10,7 @@
       , cabal-version =
           prelude.v "2.0"
       , license =
-          types.License.AllRightsReserved {=}
+          types.License.AllRightsReserved
       , library =
           prelude.unconditional.library prelude.defaults.Library
       }
diff --git a/golden-tests/dhall-to-cabal/allrightsreserved-2.2.dhall b/golden-tests/dhall-to-cabal/allrightsreserved-2.2.dhall
--- a/golden-tests/dhall-to-cabal/allrightsreserved-2.2.dhall
+++ b/golden-tests/dhall-to-cabal/allrightsreserved-2.2.dhall
@@ -10,7 +10,7 @@
       , cabal-version =
           prelude.v "2.2"
       , license =
-          types.License.AllRightsReserved {=}
+          types.License.AllRightsReserved
       , library =
           prelude.unconditional.library prelude.defaults.Library
       }
diff --git a/golden-tests/dhall-to-cabal/compiler-options-order.dhall b/golden-tests/dhall-to-cabal/compiler-options-order.dhall
--- a/golden-tests/dhall-to-cabal/compiler-options-order.dhall
+++ b/golden-tests/dhall-to-cabal/compiler-options-order.dhall
@@ -7,7 +7,7 @@
 let ghcImpl =
         λ(cfg : types.Config)
       → λ(ver : types.VersionRange)
-      → cfg.impl (types.Compiler.GHC {=}) ver
+      → cfg.impl types.Compiler.GHC ver
 
 in    ../../dhall/defaults/Package.dhall
     ⫽ { name =
diff --git a/golden-tests/dhall-to-cabal/conditional-dependencies.dhall b/golden-tests/dhall-to-cabal/conditional-dependencies.dhall
--- a/golden-tests/dhall-to-cabal/conditional-dependencies.dhall
+++ b/golden-tests/dhall-to-cabal/conditional-dependencies.dhall
@@ -7,7 +7,7 @@
 let ghcImpl =
         λ(cfg : types.Config)
       → λ(ver : types.VersionRange)
-      → cfg.impl (types.Compiler.GHC {=}) ver
+      → cfg.impl types.Compiler.GHC ver
 
 in    ../../dhall/defaults/Package.dhall
     ⫽ { name =
diff --git a/golden-tests/dhall-to-cabal/dhall-to-cabal.dhall b/golden-tests/dhall-to-cabal/dhall-to-cabal.dhall
--- a/golden-tests/dhall-to-cabal/dhall-to-cabal.dhall
+++ b/golden-tests/dhall-to-cabal/dhall-to-cabal.dhall
@@ -131,7 +131,7 @@
           , "dhall/types/SetupBuildInfo.dhall"
           ]
       , license =
-          types.License.MIT {=}
+          types.License.MIT
       , license-files =
           [ "LICENSE" ]
       , version =
@@ -175,7 +175,7 @@
                   , "Dhall.Extra"
                   ]
               , default-language =
-                  Some (types.Language.Haskell2010 {=})
+                  Some types.Language.Haskell2010
               }
           )
       , executables =
@@ -198,7 +198,7 @@
                 , other-extensions =
                     [ types.Extension.NamedFieldPuns True ]
                 , default-language =
-                    Some (types.Language.Haskell2010 {=})
+                    Some types.Language.Haskell2010
                 }
             )
           , prelude.unconditional.executable
@@ -223,7 +223,7 @@
                 , other-extensions =
                     [ types.Extension.NamedFieldPuns True ]
                 , default-language =
-                    Some (types.Language.Haskell2010 {=})
+                    Some types.Language.Haskell2010
                 }
             )
           ]
@@ -247,7 +247,7 @@
                 , type =
                     types.TestType.exitcode-stdio { main-is = "GoldenTests.hs" }
                 , default-language =
-                    Some (types.Language.Haskell2010 {=})
+                    Some types.Language.Haskell2010
                 }
             )
           ]
diff --git a/golden-tests/dhall-to-cabal/gh-53.dhall b/golden-tests/dhall-to-cabal/gh-53.dhall
--- a/golden-tests/dhall-to-cabal/gh-53.dhall
+++ b/golden-tests/dhall-to-cabal/gh-53.dhall
@@ -24,7 +24,7 @@
           Some
           (   λ(config : types.Config)
             →       if config.impl
-                       (types.Compiler.GHC {=})
+                       types.Compiler.GHC
                        (prelude.orLaterVersion (prelude.v "0.0.9"))
               
               then        if config.flag "wai-servlet-debug"
diff --git a/golden-tests/dhall-to-cabal/gh-55.dhall b/golden-tests/dhall-to-cabal/gh-55.dhall
--- a/golden-tests/dhall-to-cabal/gh-55.dhall
+++ b/golden-tests/dhall-to-cabal/gh-55.dhall
@@ -7,7 +7,7 @@
 let ghcImpl =
         λ(cfg : types.Config)
       → λ(ver : types.VersionRange)
-      → cfg.impl (types.Compiler.GHC {=}) ver
+      → cfg.impl types.Compiler.GHC ver
 
 in    ./../../dhall/defaults/Package.dhall
     ⫽ { name =
diff --git a/golden-tests/dhall-to-cabal/map-source-repo.dhall b/golden-tests/dhall-to-cabal/map-source-repo.dhall
--- a/golden-tests/dhall-to-cabal/map-source-repo.dhall
+++ b/golden-tests/dhall-to-cabal/map-source-repo.dhall
@@ -5,7 +5,7 @@
 let updateRepo =
       prelude.utils.mapSourceRepos
       (   λ(srcRepo : types.SourceRepo)
-        → srcRepo ⫽ { tag = Some "1.0.0", kind = types.RepoKind.RepoThis {=} }
+        → srcRepo ⫽ { tag = Some "1.0.0", kind = types.RepoKind.RepoThis }
       )
 
 let project = prelude.utils.GitHub-project { owner = "owner", repo = "repo" }
diff --git a/golden-tests/dhall-to-cabal/mixins-no-signatures.dhall b/golden-tests/dhall-to-cabal/mixins-no-signatures.dhall
--- a/golden-tests/dhall-to-cabal/mixins-no-signatures.dhall
+++ b/golden-tests/dhall-to-cabal/mixins-no-signatures.dhall
@@ -16,9 +16,9 @@
                           "foo"
                       , renaming =
                           { provides =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     , { package =
@@ -35,7 +35,7 @@
                               , { rename = "Third.Module", to = "Renamed" }
                               ]
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     , { package =
@@ -45,7 +45,7 @@
                               types.ModuleRenaming.hiding
                               [ "Hidden", "Also.Hidden" ]
                           , requires =
-                              types.ModuleRenaming.default {=}
+                              types.ModuleRenaming.default
                           }
                       }
                     ]
diff --git a/golden-tests/dhall-to-cabal/nested-conditions.dhall b/golden-tests/dhall-to-cabal/nested-conditions.dhall
--- a/golden-tests/dhall-to-cabal/nested-conditions.dhall
+++ b/golden-tests/dhall-to-cabal/nested-conditions.dhall
@@ -18,7 +18,7 @@
                     ⫽ { GHC =
                             [ "-Weverything" ]
                           # (       if config.impl
-                                       (types.Compiler.GHC {=})
+                                       types.Compiler.GHC
                                        (prelude.orLaterVersion (v "8.2"))
                               
                               then  [ "-Wno-redundant-constraints" ] : List Text
@@ -26,7 +26,7 @@
                               else  [] : List Text
                             )
                           # (       if config.impl
-                                       (types.Compiler.GHC {=})
+                                       types.Compiler.GHC
                                        (prelude.orLaterVersion (v "8.4"))
                               
                               then  [ "-Wno-missing-export-lists" ] : List Text
diff --git a/lib/CabalToDhall.hs b/lib/CabalToDhall.hs
--- a/lib/CabalToDhall.hs
+++ b/lib/CabalToDhall.hs
@@ -318,10 +318,7 @@
   where
     specificFields =
       Map.singleton "scope"
-        ( Expr.App
-            ( resolve PreludeConstructorsScope `Expr.Field` "Public" )
-            ( Expr.RecordLit mempty )
-        )
+        ( resolve PreludeConstructorsScope `Expr.Field` "Public" )
 
 
 packageDefault :: Default s a
@@ -371,9 +368,7 @@
               ( generaliseDeclared library )
           )
       , ( "license"
-        , Expr.App
-            ( resolve PreludeConstructorsLicense `Expr.Field` "AllRightsReserved" )
-            ( Expr.RecordLit mempty )
+        , resolve PreludeConstructorsLicense `Expr.Field` "AllRightsReserved"
         )
       , emptyListDefault "license-files" Expr.Text
       , textFieldDefault "maintainer" ""
@@ -413,9 +408,7 @@
       , emptyOptionalDefault "tag" Expr.Text
       , emptyOptionalDefault "subdir" Expr.Text
       , ( "kind"
-        , Expr.App
-            ( resolve PreludeConstructorsRepoKind `Expr.Field` "RepoHead" )
-            ( Expr.RecordLit mempty )
+        , resolve PreludeConstructorsRepoKind `Expr.Field` "RepoHead"
         )
       ]
 
@@ -621,35 +614,35 @@
           Right ( Cabal.LGPL v ) ->
             license "LGPL" ( Dhall.embed ( maybeToDhall versionToDhall ) v )
           Right Cabal.BSD2 ->
-            license "BSD2" ( Expr.RecordLit mempty )
+            licenseNullary "BSD2"
           Right Cabal.BSD3 ->
-            license "BSD3" ( Expr.RecordLit mempty )
+            licenseNullary "BSD3"
           Right Cabal.BSD4 ->
-            license "BSD4" ( Expr.RecordLit mempty )
+            licenseNullary "BSD4"
           Right Cabal.MIT ->
-            license "MIT" ( Expr.RecordLit mempty )
+            licenseNullary "MIT"
           Right Cabal.ISC ->
-            license "ISC" ( Expr.RecordLit mempty )
+            licenseNullary "ISC"
           Right ( Cabal.MPL v ) ->
             license "MPL" ( Dhall.embed versionToDhall v )
           Right ( Cabal.Apache v ) ->
             license "Apache" ( Dhall.embed ( maybeToDhall versionToDhall ) v )
           Right Cabal.PublicDomain ->
-            license "PublicDomain" ( Expr.RecordLit mempty )
+            licenseNullary "PublicDomain"
           Right Cabal.AllRightsReserved ->
-            license "AllRightsReserved" ( Expr.RecordLit mempty )
+            licenseNullary "AllRightsReserved"
           -- Note: SPDX.NONE is what Cabal reports for a file without
           -- a 'license' field, even for pre-2.2 spec versions.
           Left SPDX.NONE ->
-            license "AllRightsReserved" ( Expr.RecordLit mempty )
+            licenseNullary "AllRightsReserved"
           Right Cabal.UnspecifiedLicense ->
-            license "Unspecified" ( Expr.RecordLit mempty )
+            licenseNullary "Unspecified"
           Right ( Cabal.UnknownLicense "UnspecifiedLicense" ) ->
-            license "Unspecified" ( Expr.RecordLit mempty )
+            licenseNullary "Unspecified"
           Right ( Cabal.UnknownLicense l ) ->
-            license "Unspecified" ( Expr.TextLit (Expr.Chunks [] (StrictText.pack l)) )
+            license "Unknown" ( Expr.TextLit (Expr.Chunks [] (StrictText.pack l)) )
           Right Cabal.OtherLicense ->
-            license "Other" ( Expr.RecordLit mempty )
+            licenseNullary "Other"
           Left ( SPDX.License x ) ->
             license "SPDX" ( Dhall.embed spdxLicenseExpressionToDhall x )
     , Dhall.declared =
@@ -659,6 +652,8 @@
     license name =
       Expr.App
         ( Expr.Var "types" `Expr.Field` "License" `Expr.Field` name )
+    licenseNullary name =
+      Expr.Var "types" `Expr.Field` "License" `Expr.Field` name
 
 spdxLicenseExpressionToDhall :: Dhall.InputType SPDX.LicenseExpression
 spdxLicenseExpressionToDhall =
@@ -722,9 +717,7 @@
 spdxLicenseIdToDhall =
   Dhall.InputType
     { Dhall.embed = \ident ->
-        Expr.App
-          ( Expr.Var "types" `Expr.Field` "LicenseId" `Expr.Field` identName ident )
-          ( Expr.RecordLit mempty )
+        Expr.Var "types" `Expr.Field` "LicenseId" `Expr.Field` identName ident
     , Dhall.declared =
         Expr.Var "types" `Expr.Field` "LicenseId"
     }
@@ -739,9 +732,7 @@
 spdxLicenseExceptionIdToDhall =
   Dhall.InputType
     { Dhall.embed = \ident ->
-        Expr.App
-          ( Expr.Var "types" `Expr.Field` "LicenseExceptionId" `Expr.Field` identName ident )
-          ( Expr.RecordLit mempty )
+        Expr.Var "types" `Expr.Field` "LicenseExceptionId" `Expr.Field` identName ident
     , Dhall.declared =
         Expr.Var "types" `Expr.Field` "LicenseExceptionId"
     }
@@ -775,9 +766,9 @@
               error $ "Union did not match anything. Given " ++ show a
 
             ( First ( Just ( k, v ) ), alts ) ->
-              Expr.UnionLit k v alts
+              Expr.UnionLit k v ( Just <$> alts )
     , Dhall.declared =
-        sortExpr ( Expr.Union t )
+        sortExpr ( Expr.Union ( Just <$> t ) )
     }
 
 
@@ -833,50 +824,52 @@
   let
     constructor k v =
       Expr.App ( Expr.Var "types" `Expr.Field` "Compiler" `Expr.Field` k ) v
+    nullary k =
+      Expr.Var "types" `Expr.Field` "Compiler" `Expr.Field` k
 
   in
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.Eta ->
-          constructor "Eta" ( Expr.RecordLit mempty )
+          nullary "Eta"
 
         Cabal.GHC ->
-          constructor "GHC" ( Expr.RecordLit mempty )
+          nullary "GHC"
 
         Cabal.GHCJS ->
-          constructor "GHCJS" ( Expr.RecordLit mempty )
+          nullary "GHCJS"
 
         Cabal.HBC ->
-          constructor "HBC" ( Expr.RecordLit mempty )
+          nullary "HBC"
 
         Cabal.HaskellSuite v ->
           constructor "HaskellSuite"
           ( Expr.Record ( Map.singleton "_1" ( dhallString v ) ) )
 
         Cabal.Helium ->
-          constructor "Helium" ( Expr.RecordLit mempty )
+          nullary "Helium"
 
         Cabal.Hugs ->
-          constructor "Hugs" ( Expr.RecordLit mempty )
+          nullary "Hugs"
 
         Cabal.JHC ->
-          constructor "JHC" ( Expr.RecordLit mempty )
+          nullary "JHC"
 
         Cabal.LHC ->
-          constructor "LHC" ( Expr.RecordLit mempty )
+          nullary "LHC"
 
         Cabal.NHC ->
-          constructor "NHC" ( Expr.RecordLit mempty )
+          nullary "NHC"
 
         Cabal.OtherCompiler v ->
           constructor "OtherCompiler"
           ( Expr.Record ( Map.singleton "_1" ( dhallString v ) ) )
 
         Cabal.UHC ->
-          constructor "UHC" ( Expr.RecordLit mempty )
+          nullary "UHC"
 
         Cabal.YHC ->
-          constructor "YHC" ( Expr.RecordLit mempty )
+          nullary "YHC"
     , Dhall.declared =
         Expr.Var "types" `Expr.Field` "Compiler"
     }
@@ -954,13 +947,9 @@
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.RepoThis ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoThis" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoThis"
         Cabal.RepoHead ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoHead" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoHead"
         Cabal.RepoKindUnknown str ->
           Expr.App
             ( Expr.Var "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoThis" )
@@ -975,21 +964,21 @@
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.Darcs ->
-          Expr.App ( constr "Darcs" ) ( Expr.RecordLit mempty )
+          constr "Darcs"
         Cabal.Git ->
-          Expr.App ( constr "Git" ) ( Expr.RecordLit mempty )
+          constr "Git"
         Cabal.SVN ->
-          Expr.App ( constr "SVN" ) ( Expr.RecordLit mempty )
+          constr "SVN"
         Cabal.CVS ->
-          Expr.App ( constr "CVS" ) ( Expr.RecordLit mempty )
+          constr "CVS"
         Cabal.Mercurial ->
-          Expr.App ( constr "Mercurial" ) ( Expr.RecordLit mempty )
+          constr "Mercurial"
         Cabal.GnuArch ->
-          Expr.App ( constr "GnuArch" ) ( Expr.RecordLit mempty )
+          constr "GnuArch"
         Cabal.Monotone ->
-          Expr.App ( constr "Monotone" ) ( Expr.RecordLit mempty )
+          constr "Monotone"
         Cabal.Bazaar ->
-          Expr.App ( constr "Bazaar" ) ( Expr.RecordLit mempty )
+          constr "Bazaar"
         Cabal.OtherRepoType str ->
           Expr.App
             ( constr "OtherRepoType" )
@@ -1015,24 +1004,16 @@
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.Simple ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Simple" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Simple"
 
         Cabal.Configure ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Configure" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Configure"
 
         Cabal.Custom ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Custom" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Custom"
 
         Cabal.Make ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Make" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "BuildType" `Expr.Field` "Make"
 
     , Dhall.declared =
         Expr.Var "types" `Expr.Field` "BuildType"
@@ -1197,84 +1178,52 @@
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.Linux ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Linux" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Linux"
 
         Cabal.Windows ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Windows" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Windows"
 
         Cabal.OSX ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "OSX" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "OSX"
 
         Cabal.FreeBSD ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "FreeBSD" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "FreeBSD"
 
         Cabal.OpenBSD ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "OpenBSD" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "OpenBSD"
 
         Cabal.NetBSD ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "NetBSD" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "NetBSD"
 
         Cabal.DragonFly ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "DragonFly" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "DragonFly"
 
         Cabal.Solaris ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Solaris" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Solaris"
 
         Cabal.AIX ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "AIX" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "AIX"
 
         Cabal.HPUX ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "HPUX" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "HPUX"
 
         Cabal.IRIX ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "IRIX" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "IRIX"
 
         Cabal.HaLVM ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "HaLVM" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "HaLVM"
 
         Cabal.Hurd ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Hurd" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Hurd"
 
         Cabal.IOS ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "IOS" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "IOS"
 
         Cabal.Android ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Android" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Android"
 
         Cabal.Ghcjs ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Ghcjs" )
-            ( Expr.RecordLit mempty )
+          Expr.Var "types" `Expr.Field` "OS" `Expr.Field` "Ghcjs"
 
         Cabal.OtherOS os ->
           Expr.App
@@ -1529,9 +1478,7 @@
                     )
                 )
             Cabal.DefaultRenaming ->
-              Expr.App
-                ( Expr.Var "types" `Expr.Field` "ModuleRenaming" `Expr.Field` "default" )
-                ( Expr.RecordLit mempty )
+              Expr.Var "types" `Expr.Field` "ModuleRenaming" `Expr.Field` "default"
             Cabal.HidingRenaming hidden ->
               Expr.App
                 ( Expr.Var "types" `Expr.Field` "ModuleRenaming" `Expr.Field` "hiding" )
@@ -1627,13 +1574,9 @@
   Dhall.InputType
     { Dhall.embed = \case
         Cabal.ExecutablePublic ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "Scope" `Expr.Field` "Public" )
-            ( Expr.RecordLit mempty )
+            Expr.Var "types" `Expr.Field` "Scope" `Expr.Field` "Public"
         Cabal.ExecutablePrivate ->
-          Expr.App
-            ( Expr.Var "types" `Expr.Field` "Scope" `Expr.Field` "Private" )
-            ( Expr.RecordLit mempty )
+            Expr.Var "types" `Expr.Field` "Scope" `Expr.Field` "Private"
     , Dhall.declared =
         Expr.Var "types" `Expr.Field` "Scope"
     }
diff --git a/lib/Dhall/Extra.hs b/lib/Dhall/Extra.hs
--- a/lib/Dhall/Extra.hs
+++ b/lib/Dhall/Extra.hs
@@ -5,8 +5,7 @@
 {-# language RecordWildCards #-}
 
 module Dhall.Extra
-  ( makeUnion
-  , validateType
+  ( validateType
   , sortExpr
   )
   where
@@ -15,30 +14,10 @@
 import Data.List ( sortBy )
 import Data.Ord ( comparing )
 
-import qualified Data.Text as StrictText
 import qualified Dhall
 import qualified Dhall.Core as Dhall ( Expr )
 import qualified Dhall.Core as Expr ( Expr(..) )
 import qualified Dhall.Map as Map
-
-
-makeUnion :: Map.Map StrictText.Text ( Dhall.Type a ) -> Dhall.Type a
-makeUnion alts =
-  let
-    extract expr = do
-      Expr.UnionLit ctor v _ <-
-        return expr
-
-      t <-
-        Map.lookup ctor alts
-
-      Dhall.extract t v
-
-    expected =
-      sortExpr ( Expr.Union ( Dhall.expected <$> alts ) )
-
-  in Dhall.Type { .. }
-
 
 
 validateType :: Dhall.Type ( Maybe a ) -> Dhall.Type a
diff --git a/lib/DhallLocation.hs b/lib/DhallLocation.hs
--- a/lib/DhallLocation.hs
+++ b/lib/DhallLocation.hs
@@ -44,7 +44,6 @@
                           )
                           Nothing
                           Nothing
-                          Nothing
                       )
                 }
           , Dhall.Core.importMode =
@@ -66,7 +65,6 @@
                              ( Dhall.Core.Directory [ "dhall", version, "dhall-to-cabal", "dhall-lang" ] )
                              "types.dhall"
                           )
-                          Nothing
                           Nothing
                           Nothing
                       )
diff --git a/lib/DhallToCabal.hs b/lib/DhallToCabal.hs
--- a/lib/DhallToCabal.hs
+++ b/lib/DhallToCabal.hs
@@ -34,6 +34,8 @@
   , version
   , configRecordType
   , buildInfoType
+  , executableScope
+  , moduleRenaming
 
   , sortExpr
   ) where
@@ -419,20 +421,16 @@
 
 
 testSuiteInterface :: Dhall.Type Cabal.TestSuiteInterface
-testSuiteInterface =
-  makeUnion
-    ( Map.fromList
-        [ ( "exitcode-stdio"
-          , Cabal.TestSuiteExeV10 ( Cabal.mkVersion [ 1, 0 ] )
-              <$> Dhall.record ( Dhall.field "main-is" Dhall.string )
-          )
-        , ( "detailed"
-          , Cabal.TestSuiteLibV09 ( Cabal.mkVersion [ 0, 9 ] )
-              <$> Dhall.record ( Dhall.field "module" moduleName )
-          )
-        ]
-    )
-
+testSuiteInterface = Dhall.union
+  ( mconcat
+    [ Cabal.TestSuiteExeV10 ( Cabal.mkVersion [ 1, 0 ] )
+        <$> Dhall.constructor "exitcode-stdio"
+              ( Dhall.record ( Dhall.field "main-is" Dhall.string ) )
+    , Cabal.TestSuiteLibV09 ( Cabal.mkVersion [ 0, 9 ] )
+        <$> Dhall.constructor "detailed"
+              ( Dhall.record ( Dhall.field "module" moduleName ) )
+    ]
+  )
 
 
 
@@ -490,13 +488,12 @@
 
 
 foreignLibType :: Dhall.Type Cabal.ForeignLibType
-foreignLibType =
-  makeUnion
-    ( Map.fromList
-        [ ( "Shared", Cabal.ForeignLibNativeShared <$ Dhall.unit )
-        , ( "Static", Cabal.ForeignLibNativeStatic <$ Dhall.unit )
-        ]
-    )
+foreignLibType = Dhall.union
+  ( mconcat
+    [ Cabal.ForeignLibNativeShared <$ Dhall.constructor "Shared" Dhall.unit
+    , Cabal.ForeignLibNativeStatic <$ Dhall.constructor "Static" Dhall.unit
+    ]
+  )
 
 
 
@@ -707,27 +704,26 @@
 
 
 license :: Dhall.Type (Either SPDX.License Cabal.License)
-license =
-  makeUnion
-    ( Map.fromList
-        [ ( "GPL", Right . Cabal.GPL <$> Dhall.maybe version )
-        , ( "AGPL", Right . Cabal.AGPL <$> Dhall.maybe version )
-        , ( "LGPL", Right . Cabal.LGPL <$> Dhall.maybe version )
-        , ( "BSD2", Right Cabal.BSD2 <$ Dhall.unit )
-        , ( "BSD3", Right Cabal.BSD3 <$ Dhall.unit )
-        , ( "BSD4", Right Cabal.BSD4 <$ Dhall.unit )
-        , ( "MIT", Right Cabal.MIT <$ Dhall.unit )
-        , ( "ISC", Right Cabal.ISC <$ Dhall.unit )
-        , ( "MPL", Right . Cabal.MPL <$> version )
-        , ( "Apache", Right . Cabal.Apache <$> Dhall.maybe version )
-        , ( "PublicDomain", Right Cabal.PublicDomain <$ Dhall.unit )
-        , ( "AllRightsReserved", Right Cabal.AllRightsReserved<$ Dhall.unit )
-        , ( "Unspecified", Right Cabal.UnspecifiedLicense <$ Dhall.unit )
-        , ( "Unknown", Right . Cabal.UnknownLicense <$> Dhall.string )
-        , ( "Other", Right Cabal.OtherLicense <$ Dhall.unit )
-        , ( "SPDX", Left . SPDX.License <$> spdxLicense )
-        ]
-    )
+license = Dhall.union
+  ( mconcat
+    [ Right . Cabal.GPL <$> Dhall.constructor "GPL" ( Dhall.maybe version )
+    , Right . Cabal.AGPL <$> Dhall.constructor "AGPL" ( Dhall.maybe version )
+    , Right . Cabal.LGPL <$> Dhall.constructor "LGPL" ( Dhall.maybe version )
+    , Right Cabal.BSD2 <$ Dhall.constructor "BSD2" Dhall.unit
+    , Right Cabal.BSD3 <$ Dhall.constructor "BSD3" Dhall.unit
+    , Right Cabal.BSD4 <$ Dhall.constructor "BSD4" Dhall.unit
+    , Right Cabal.MIT <$ Dhall.constructor "MIT" Dhall.unit
+    , Right Cabal.ISC <$ Dhall.constructor "ISC" Dhall.unit
+    , Right . Cabal.MPL <$> Dhall.constructor "MPL" version
+    , Right . Cabal.Apache <$> Dhall.constructor "Apache" ( Dhall.maybe version )
+    , Right Cabal.PublicDomain <$ Dhall.constructor "PublicDomain" Dhall.unit
+    , Right Cabal.AllRightsReserved <$ Dhall.constructor "AllRightsReserved" Dhall.unit
+    , Right Cabal.UnspecifiedLicense <$ Dhall.constructor "Unspecified" Dhall.unit
+    , Right . Cabal.UnknownLicense <$> Dhall.constructor "Unknown" Dhall.string
+    , Right Cabal.OtherLicense <$ Dhall.constructor "Other" Dhall.unit
+    , Left . SPDX.License <$> Dhall.constructor "SPDX" spdxLicense
+    ]
+  )
 
 
 spdxLicense :: Dhall.Type SPDX.LicenseExpression
@@ -928,13 +924,12 @@
 
 
 executableScope :: Dhall.Type Cabal.ExecutableScope
-executableScope =
-  makeUnion
-    ( Map.fromList
-        [ ( "Public", Cabal.ExecutablePublic <$ Dhall.unit )
-        , ( "Private", Cabal.ExecutablePrivate <$ Dhall.unit )
-        ]
-    )
+executableScope = Dhall.union
+  ( mconcat
+    [ Cabal.ExecutablePublic <$ Dhall.constructor "Public" Dhall.unit
+    , Cabal.ExecutablePrivate <$ Dhall.constructor "Private" Dhall.unit
+    ]
+  )
 
 
 
@@ -964,11 +959,8 @@
 
 
 foreignLibOption :: Dhall.Type Cabal.ForeignLibOption
-foreignLibOption =
-  makeUnion
-    ( Map.fromList
-        [ ( "Standalone", Cabal.ForeignLibStandalone <$ Dhall.unit ) ]
-    )
+foreignLibOption = Dhall.union $
+  Cabal.ForeignLibStandalone <$ Dhall.constructor "Standalone" Dhall.unit
 
 
 versionInfo :: Dhall.Type Cabal.LibVersionInfo
@@ -985,40 +977,20 @@
 extension :: Dhall.Type Cabal.Extension
 extension =
   let
-    knownExtension =
-      sortType Dhall.genericAuto
-
-    unitType =
-      Expr.Record mempty
-
-    extract expr = do
-      Expr.UnionLit k v alts <-
-        return expr
-
-      ext <-
-        Dhall.extract
-          knownExtension
-          ( Expr.UnionLit k ( Expr.RecordLit mempty ) ( unitType <$ alts ) )
-
-      case v of
-        Expr.BoolLit True ->
-          return ( Cabal.EnableExtension ext )
-
-        Expr.BoolLit False ->
-          return ( Cabal.DisableExtension ext )
-
-        _ ->
-          Nothing
-
-    expected =
-      case Dhall.expected knownExtension of
-        Expr.Union alts ->
-          sortExpr ( Expr.Union ( Expr.Bool <$ alts ) )
+    extName :: Cabal.KnownExtension -> StrictText.Text
+    extName e =
+      StrictText.pack ( show e )
 
-        _ ->
-          error "Could not derive extension type"
+    enableDisable ext enabled = if enabled
+      then Cabal.EnableExtension ext
+      else Cabal.DisableExtension ext
 
-  in Dhall.Type { .. }
+    constr :: Cabal.KnownExtension -> Dhall.UnionType Cabal.Extension
+    constr ext = Dhall.constructor
+      ( extName ext )
+      ( enableDisable ext <$> Dhall.bool )
+  in
+    Dhall.union ( foldMap constr [ minBound .. maxBound ] )
 
 
 
@@ -1329,26 +1301,21 @@
 
 
 moduleRenaming :: Dhall.Type Cabal.ModuleRenaming
-moduleRenaming =
-  makeUnion
-    ( Map.fromList
-      [ ( "renaming"
-        , fmap Cabal.ModuleRenaming
-            ( Dhall.list
-              ( Dhall.record
-                ( (,) <$> Dhall.field "rename" moduleName <*> Dhall.field "to" moduleName )
+moduleRenaming = Dhall.union
+  ( mconcat
+    [ Cabal.ModuleRenaming
+        <$> Dhall.constructor "renaming"
+              ( Dhall.list
+                ( Dhall.record
+                  ( (,) <$> Dhall.field "rename" moduleName <*> Dhall.field "to" moduleName )
+                )
               )
-            )
-        )
-      , ( "default"
-        , Dhall.record ( pure Cabal.DefaultRenaming )
-        )
-      , ( "hiding"
-        , fmap Cabal.HidingRenaming
-            ( Dhall.list moduleName )
-        )
-      ]
-    )
+    , Cabal.DefaultRenaming
+        <$ Dhall.constructor "default" Dhall.unit
+    , Cabal.HidingRenaming
+        <$> Dhall.constructor "hiding" ( Dhall.list moduleName )
+    ]
+  )
 
 
 sortType :: Dhall.Type a -> Dhall.Type a
