diff --git a/cabal-gild.cabal b/cabal-gild.cabal
--- a/cabal-gild.cabal
+++ b/cabal-gild.cabal
@@ -11,7 +11,7 @@
 maintainer: Taylor Fausak
 name: cabal-gild
 synopsis: Formats package descriptions.
-version: 1.8.4.0
+version: 1.8.4.1
 
 source-repository head
   type: git
@@ -53,8 +53,8 @@
   import: library
   autogen-modules: Paths_cabal_gild
   build-depends:
-    Cabal-syntax ^>=3.12.0.0 || ^>=3.14.0.0 || ^>=3.16.0.0,
     bytestring ^>=0.12.0.2,
+    Cabal-syntax ^>=3.12.0.0 || ^>=3.14.0.0 || ^>=3.16.0.0,
     containers ^>=0.7 || ^>=0.8,
     exceptions ^>=0.10.7,
     filepath ^>=1.4.100.1 || ^>=1.5.2.0,
@@ -106,13 +106,11 @@
     CabalGild.Unstable.Extra.FieldLine
     CabalGild.Unstable.Extra.FilePath
     CabalGild.Unstable.Extra.IncludeRenaming
-    CabalGild.Unstable.Extra.LibraryName
     CabalGild.Unstable.Extra.List
     CabalGild.Unstable.Extra.Mixin
     CabalGild.Unstable.Extra.ModuleName
     CabalGild.Unstable.Extra.ModuleRenaming
     CabalGild.Unstable.Extra.Name
-    CabalGild.Unstable.Extra.PackageName
     CabalGild.Unstable.Extra.SectionArg
     CabalGild.Unstable.Extra.String
     CabalGild.Unstable.Extra.UnqualComponentName
@@ -126,7 +124,6 @@
     CabalGild.Unstable.Type.Context
     CabalGild.Unstable.Type.Dependency
     CabalGild.Unstable.Type.DiscoverTarget
-    CabalGild.Unstable.Type.Extension
     CabalGild.Unstable.Type.Flag
     CabalGild.Unstable.Type.Input
     CabalGild.Unstable.Type.Leniency
@@ -137,7 +134,6 @@
     CabalGild.Unstable.Type.Optional
     CabalGild.Unstable.Type.Output
     CabalGild.Unstable.Type.Pragma
-    CabalGild.Unstable.Type.Set
     CabalGild.Unstable.Type.SomeParsecParser
     CabalGild.Unstable.Type.TestedWith
     CabalGild.Unstable.Type.Variable
diff --git a/source/library/CabalGild/Unstable/Action/FormatFields.hs b/source/library/CabalGild/Unstable/Action/FormatFields.hs
--- a/source/library/CabalGild/Unstable/Action/FormatFields.hs
+++ b/source/library/CabalGild/Unstable/Action/FormatFields.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE TypeApplications #-}
 
 module CabalGild.Unstable.Action.FormatFields where
@@ -10,22 +11,25 @@
 import qualified CabalGild.Unstable.Type.Comments as Comments
 import qualified CabalGild.Unstable.Type.Condition as Condition
 import qualified CabalGild.Unstable.Type.Dependency as Dependency
-import qualified CabalGild.Unstable.Type.Extension as Extension
 import qualified CabalGild.Unstable.Type.Mixin as Mixin
 import qualified CabalGild.Unstable.Type.SomeParsecParser as SPP
 import qualified CabalGild.Unstable.Type.TestedWith as TestedWith
 import qualified CabalGild.Unstable.Type.Variable as Variable
 import qualified Data.ByteString as ByteString
+import qualified Data.Containers.ListUtils as ListUtils
 import qualified Data.Function as Function
 import qualified Data.Functor.Identity as Identity
+import qualified Data.List as List
 import qualified Data.Map as Map
 import qualified Data.Maybe as Maybe
 import qualified Distribution.CabalSpecVersion as CabalSpecVersion
+import qualified Distribution.Compat.Newtype as Newtype
 import qualified Distribution.FieldGrammar.Newtypes as Newtypes
 import qualified Distribution.Fields as Fields
 import qualified Distribution.ModuleName as ModuleName
 import qualified Distribution.Parsec as Parsec
 import qualified Distribution.Parsec.FieldLineStream as FieldLineStream
+import qualified Distribution.Pretty as Pretty
 import qualified Distribution.Types.ExeDependency as ExeDependency
 import qualified Distribution.Types.ForeignLibOption as ForeignLibOption
 import qualified Distribution.Types.LegacyExeDependency as LegacyExeDependency
@@ -164,61 +168,75 @@
   let (=:) :: String -> SPP.SomeParsecParser -> (Fields.FieldName, SPP.SomeParsecParser)
       (=:) = (,) . String.toUtf8
    in Map.fromList
-        [ "asm-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "asm-sources" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "autogen-includes" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "autogen-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName),
-          "build-depends" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity Dependency.Dependency),
-          "build-tool-depends" =: SPP.set @Newtypes.CommaFSep @(Identity.Identity ExeDependency.ExeDependency),
-          "build-tools" =: SPP.set @Newtypes.CommaFSep @(Identity.Identity LegacyExeDependency.LegacyExeDependency),
-          "c-sources" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "cc-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "cmm-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "cmm-sources" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "code-generators" =: SPP.list @Newtypes.CommaFSep @Newtypes.Token,
-          "cpp-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "cxx-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "cxx-sources" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "data-files" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "default-extensions" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Extension.Extension),
-          "exposed-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName),
-          "extensions" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Extension.Extension),
-          "extra-bundled-libraries" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-doc-files" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "extra-dynamic-library-flavours" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-framework-dirs" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "extra-ghci-libraries" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-lib-dirs-static" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "extra-lib-dirs" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "extra-libraries-static" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-libraries" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-library-flavours" =: SPP.set @Newtypes.VCat @Newtypes.Token,
-          "extra-source-files" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "extra-tmp-files" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "frameworks" =: SPP.set @Newtypes.FSep @Newtypes.Token,
-          "ghc-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "ghc-prof-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "ghc-shared-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "ghcjs-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "ghcjs-prof-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "ghcjs-shared-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "hs-source-dirs" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT,
-          "hsc2hs-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "include-dirs" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "includes" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "install-includes" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "js-sources" =: SPP.set @Newtypes.VCat @Newtypes.FilePathNT,
-          "ld-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token',
-          "license-files" =: SPP.set @Newtypes.FSep @Newtypes.FilePathNT,
-          "mixins" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity Mixin.Mixin),
-          "options" =: SPP.set @Newtypes.FSep @(Identity.Identity ForeignLibOption.ForeignLibOption),
-          "other-extensions" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Extension.Extension),
-          "other-languages" =: SPP.set @Newtypes.FSep @(Newtypes.MQuoted Haskell.Language),
-          "other-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName),
-          "pkgconfig-depends" =: SPP.set @Newtypes.CommaFSep @(Identity.Identity PkgconfigDependency.PkgconfigDependency),
-          "reexported-modules" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity ModuleReexport.ModuleReexport),
-          "setup-depends" =: SPP.set @Newtypes.CommaVCat @(Identity.Identity Dependency.Dependency),
-          "signatures" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName),
-          "tested-with" =: SPP.set @Newtypes.FSep @(Identity.Identity TestedWith.TestedWith),
-          "virtual-modules" =: SPP.set @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName)
+        [ "asm-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "asm-sources" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "autogen-includes" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "autogen-modules" =: SPP.list @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName) prettySet,
+          "build-depends" =: SPP.list @Newtypes.CommaVCat @(Identity.Identity Dependency.Dependency) prettySet,
+          "build-tool-depends" =: SPP.list @Newtypes.CommaFSep @(Identity.Identity ExeDependency.ExeDependency) prettySet,
+          "build-tools" =: SPP.list @Newtypes.CommaFSep @(Identity.Identity LegacyExeDependency.LegacyExeDependency) prettySet,
+          "c-sources" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "cc-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "cmm-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "cmm-sources" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "code-generators" =: SPP.list @Newtypes.CommaFSep @Newtypes.Token id,
+          "cpp-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "cxx-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "cxx-sources" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "data-files" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "default-extensions" =: SPP.list @Newtypes.FSep @(Newtypes.MQuoted Haskell.Extension) prettySet,
+          "exposed-modules" =: SPP.list @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName) prettySet,
+          "extensions" =: SPP.list @Newtypes.FSep @(Newtypes.MQuoted Haskell.Extension) prettySet,
+          "extra-bundled-libraries" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-doc-files" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "extra-dynamic-library-flavours" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-framework-dirs" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "extra-ghci-libraries" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-lib-dirs-static" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "extra-lib-dirs" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "extra-libraries-static" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-libraries" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-library-flavours" =: SPP.list @Newtypes.VCat @Newtypes.Token stringSet,
+          "extra-source-files" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "extra-tmp-files" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "frameworks" =: SPP.list @Newtypes.FSep @Newtypes.Token stringSet,
+          "ghc-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "ghc-prof-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "ghc-shared-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "ghcjs-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "ghcjs-prof-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "ghcjs-shared-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "hs-source-dirs" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT id,
+          "hsc2hs-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "include-dirs" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "includes" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "install-includes" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "js-sources" =: SPP.list @Newtypes.VCat @Newtypes.FilePathNT stringSet,
+          "ld-options" =: SPP.list @Newtypes.NoCommaFSep @Newtypes.Token' id,
+          "license-files" =: SPP.list @Newtypes.FSep @Newtypes.FilePathNT stringSet,
+          "mixins" =: SPP.list @Newtypes.CommaVCat @(Identity.Identity Mixin.Mixin) prettySet,
+          "options" =: SPP.list @Newtypes.FSep @(Identity.Identity ForeignLibOption.ForeignLibOption) prettySet,
+          "other-extensions" =: SPP.list @Newtypes.FSep @(Newtypes.MQuoted Haskell.Extension) prettySet,
+          "other-languages" =: SPP.list @Newtypes.FSep @(Newtypes.MQuoted Haskell.Language) prettySet,
+          "other-modules" =: SPP.list @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName) prettySet,
+          "pkgconfig-depends" =: SPP.list @Newtypes.CommaFSep @(Identity.Identity PkgconfigDependency.PkgconfigDependency) prettySet,
+          "reexported-modules" =: SPP.list @Newtypes.CommaVCat @(Identity.Identity ModuleReexport.ModuleReexport) prettySet,
+          "setup-depends" =: SPP.list @Newtypes.CommaVCat @(Identity.Identity Dependency.Dependency) prettySet,
+          "signatures" =: SPP.list @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName) prettySet,
+          "tested-with" =: SPP.list @Newtypes.FSep @(Identity.Identity TestedWith.TestedWith) prettySet,
+          "virtual-modules" =: SPP.list @Newtypes.VCat @(Newtypes.MQuoted ModuleName.ModuleName) prettySet
         ]
+
+stringSet :: (Newtype.Newtype [String] a) => a -> a
+stringSet =
+  Newtype.pack
+    . List.sortOn (\x -> (String.toCaseFold x, x))
+    . ListUtils.nubOrd
+    . Newtype.unpack
+
+prettySet :: (Newtype.Newtype [b] a, Ord b, Pretty.Pretty b) => a -> a
+prettySet =
+  Newtype.pack
+    . List.sortOn (\x -> (String.toCaseFold $ Pretty.prettyShow x, x))
+    . ListUtils.nubOrd
+    . Newtype.unpack
diff --git a/source/library/CabalGild/Unstable/Extra/LibraryName.hs b/source/library/CabalGild/Unstable/Extra/LibraryName.hs
deleted file mode 100644
--- a/source/library/CabalGild/Unstable/Extra/LibraryName.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module CabalGild.Unstable.Extra.LibraryName where
-
-import qualified CabalGild.Unstable.Extra.UnqualComponentName as UnqualComponentName
-import qualified Distribution.Types.LibraryName as LibraryName
-
-toCaseFold :: LibraryName.LibraryName -> LibraryName.LibraryName
-toCaseFold ln = case ln of
-  LibraryName.LMainLibName -> LibraryName.LMainLibName
-  LibraryName.LSubLibName uqn -> LibraryName.LSubLibName $ UnqualComponentName.toCaseFold uqn
diff --git a/source/library/CabalGild/Unstable/Extra/Mixin.hs b/source/library/CabalGild/Unstable/Extra/Mixin.hs
--- a/source/library/CabalGild/Unstable/Extra/Mixin.hs
+++ b/source/library/CabalGild/Unstable/Extra/Mixin.hs
@@ -1,8 +1,6 @@
 module CabalGild.Unstable.Extra.Mixin where
 
 import qualified CabalGild.Unstable.Extra.IncludeRenaming as IncludeRenaming
-import qualified CabalGild.Unstable.Extra.LibraryName as LibraryName
-import qualified CabalGild.Unstable.Extra.PackageName as PackageName
 import qualified Distribution.Types.Mixin as Mixin
 
 sort :: Mixin.Mixin -> Mixin.Mixin
@@ -11,11 +9,4 @@
     { Mixin.mixinPackageName = Mixin.mixinPackageName x,
       Mixin.mixinLibraryName = Mixin.mixinLibraryName x,
       Mixin.mixinIncludeRenaming = IncludeRenaming.sort $ Mixin.mixinIncludeRenaming x
-    }
-
-toCaseFold :: Mixin.Mixin -> Mixin.Mixin
-toCaseFold x =
-  x
-    { Mixin.mixinPackageName = PackageName.toCaseFold $ Mixin.mixinPackageName x,
-      Mixin.mixinLibraryName = LibraryName.toCaseFold $ Mixin.mixinLibraryName x
     }
diff --git a/source/library/CabalGild/Unstable/Extra/PackageName.hs b/source/library/CabalGild/Unstable/Extra/PackageName.hs
deleted file mode 100644
--- a/source/library/CabalGild/Unstable/Extra/PackageName.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module CabalGild.Unstable.Extra.PackageName where
-
-import qualified CabalGild.Unstable.Extra.String as String
-import qualified Distribution.Types.PackageName as PackageName
-
-toCaseFold :: PackageName.PackageName -> PackageName.PackageName
-toCaseFold =
-  PackageName.mkPackageName
-    . String.toCaseFold
-    . PackageName.unPackageName
diff --git a/source/library/CabalGild/Unstable/Type/Dependency.hs b/source/library/CabalGild/Unstable/Type/Dependency.hs
--- a/source/library/CabalGild/Unstable/Type/Dependency.hs
+++ b/source/library/CabalGild/Unstable/Type/Dependency.hs
@@ -14,6 +14,8 @@
 import qualified Distribution.Types.UnqualComponentName as UnqualComponentName
 import qualified Text.PrettyPrint as PrettyPrint
 
+-- | This type primarily exists because Cabal doesn't differentiate between
+-- `foo` and `foo:foo` (or `foo:{foo}`).
 data Dependency = MkDependency
   { packageName :: PackageName.PackageName,
     libraryNames :: Maybe (Either UnqualComponentName.UnqualComponentName (NonEmpty.NonEmpty UnqualComponentName.UnqualComponentName)),
diff --git a/source/library/CabalGild/Unstable/Type/Extension.hs b/source/library/CabalGild/Unstable/Type/Extension.hs
deleted file mode 100644
--- a/source/library/CabalGild/Unstable/Type/Extension.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module CabalGild.Unstable.Type.Extension where
-
-import qualified CabalGild.Unstable.Extra.String as String
-import qualified Data.Ord as Ord
-import qualified Distribution.Parsec as Parsec
-import qualified Distribution.Pretty as Pretty
-import qualified Language.Haskell.Extension as Extension
-
--- | This type exists to provide a different 'Ord' instance for
--- 'Extension.Extension'. The instance provided by @Cabal-syntax@ sorts things
--- in a surprising order. This one sorts things alphabetically.
-newtype Extension = Extension
-  { unwrap :: Extension.Extension
-  }
-  deriving (Eq, Show)
-
-instance Ord Extension where
-  compare = Ord.comparing $ \x ->
-    let y = Pretty.prettyShow x in (String.toCaseFold y, y)
-
-instance Parsec.Parsec Extension where
-  parsec = Extension <$> Parsec.parsec
-
-instance Pretty.Pretty Extension where
-  pretty = Pretty.pretty . unwrap
diff --git a/source/library/CabalGild/Unstable/Type/List.hs b/source/library/CabalGild/Unstable/Type/List.hs
--- a/source/library/CabalGild/Unstable/Type/List.hs
+++ b/source/library/CabalGild/Unstable/Type/List.hs
@@ -65,3 +65,22 @@
     )
       . fmap (Pretty.prettyVersioned @b v . Newtype.pack)
       . Newtype.unpack
+
+-- | Overlaps the more general instance in order to use trailing commas when
+-- possible.
+instance
+  {-# OVERLAPPING #-}
+  ( Newtype.Newtype a b,
+    Pretty.Pretty b
+  ) =>
+  Pretty.Pretty (List Newtypes.CommaVCat b a)
+  where
+  pretty = Pretty.prettyVersioned CabalSpecVersion.CabalSpecV1_0
+  prettyVersioned v =
+    ( \xs ->
+        if List.compareLength xs 1 == GT && v >= CabalSpecVersion.CabalSpecV2_2
+          then PrettyPrint.vcat $ fmap (<> PrettyPrint.comma) xs
+          else Newtypes.prettySep (Proxy.Proxy @Newtypes.CommaVCat) xs
+    )
+      . fmap (Pretty.prettyVersioned @b v . Newtype.pack)
+      . Newtype.unpack
diff --git a/source/library/CabalGild/Unstable/Type/Mixin.hs b/source/library/CabalGild/Unstable/Type/Mixin.hs
--- a/source/library/CabalGild/Unstable/Type/Mixin.hs
+++ b/source/library/CabalGild/Unstable/Type/Mixin.hs
@@ -1,21 +1,16 @@
 module CabalGild.Unstable.Type.Mixin where
 
 import qualified CabalGild.Unstable.Extra.Mixin as Mixin
-import qualified Data.Ord as Ord
 import qualified Distribution.Parsec as Parsec
 import qualified Distribution.Pretty as Pretty
 import qualified Distribution.Types.Mixin as Mixin
 
--- | This is a wrapper around 'Mixin.Mixin' that compares case insensitively
--- and sorts the nested module names when printing.
+-- | This is a wrapper around 'Mixin.Mixin' that sorts the nested module names
+-- when printing.
 newtype Mixin = Mixin
   { unwrap :: Mixin.Mixin
   }
-  deriving (Eq, Show)
-
-instance Ord Mixin where
-  compare = Ord.comparing $ \x ->
-    let y = unwrap x in (Mixin.toCaseFold y, y)
+  deriving (Eq, Ord, Show)
 
 instance Parsec.Parsec Mixin where
   parsec = Mixin <$> Parsec.parsec
diff --git a/source/library/CabalGild/Unstable/Type/Set.hs b/source/library/CabalGild/Unstable/Type/Set.hs
deleted file mode 100644
--- a/source/library/CabalGild/Unstable/Type/Set.hs
+++ /dev/null
@@ -1,91 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TypeApplications #-}
-
-module CabalGild.Unstable.Type.Set where
-
-import qualified CabalGild.Unstable.Extra.List as List
-import qualified Data.Proxy as Proxy
-import qualified Data.Set as Set
-import qualified Distribution.CabalSpecVersion as CabalSpecVersion
-import qualified Distribution.Compat.Newtype as Newtype
-import qualified Distribution.FieldGrammar.Newtypes as Newtypes
-import qualified Distribution.Parsec as Parsec
-import qualified Distribution.Pretty as Pretty
-import qualified Text.PrettyPrint as PrettyPrint
-
--- | A thin wrapper around 'Newtypes.Set''. This is used to define custom
--- instances of 'Pretty.Pretty' that use trailing commas when the Cabal spec
--- version is recent enough (at least @2.2@).
-newtype Set s b a = Set
-  { unwrap :: Newtypes.Set' s b a
-  }
-
-instance Newtype.Newtype (Set.Set a) (Set s b a) where
-  pack = Set . Newtype.pack
-  unpack = Newtype.unpack . unwrap
-
-instance
-  ( Newtype.Newtype a b,
-    Ord a,
-    Parsec.Parsec b,
-    Newtypes.Sep s
-  ) =>
-  Parsec.Parsec (Set s b a)
-  where
-  parsec = Set <$> Parsec.parsec
-
-instance
-  ( Newtype.Newtype a b,
-    Pretty.Pretty b,
-    Newtypes.Sep s
-  ) =>
-  Pretty.Pretty (Set s b a)
-  where
-  pretty = Pretty.prettyVersioned CabalSpecVersion.CabalSpecV1_0
-  prettyVersioned v =
-    Newtypes.prettySep (Proxy.Proxy @s)
-      . fmap (Pretty.prettyVersioned @b v . Newtype.pack)
-      . Set.toAscList
-      . Newtype.unpack
-
--- | Overlaps the more general instance in order to use trailing commas when
--- possible.
-instance
-  {-# OVERLAPPING #-}
-  ( Newtype.Newtype a b,
-    Pretty.Pretty b
-  ) =>
-  Pretty.Pretty (Set Newtypes.CommaFSep b a)
-  where
-  pretty = Pretty.prettyVersioned CabalSpecVersion.CabalSpecV1_0
-  prettyVersioned v =
-    ( \xs ->
-        if List.compareLength xs 1 == GT && v >= CabalSpecVersion.CabalSpecV2_2
-          then PrettyPrint.fsep $ fmap (<> PrettyPrint.comma) xs
-          else Newtypes.prettySep (Proxy.Proxy @Newtypes.CommaFSep) xs
-    )
-      . fmap (Pretty.prettyVersioned @b v . Newtype.pack)
-      . Set.toAscList
-      . Newtype.unpack
-
--- | Overlaps the more general instance in order to use trailing commas when
--- possible.
-instance
-  {-# OVERLAPPING #-}
-  ( Newtype.Newtype a b,
-    Pretty.Pretty b
-  ) =>
-  Pretty.Pretty (Set Newtypes.CommaVCat b a)
-  where
-  pretty = Pretty.prettyVersioned CabalSpecVersion.CabalSpecV1_0
-  prettyVersioned v =
-    ( \xs ->
-        if List.compareLength xs 1 == GT && v >= CabalSpecVersion.CabalSpecV2_2
-          then PrettyPrint.vcat $ fmap (<> PrettyPrint.comma) xs
-          else Newtypes.prettySep (Proxy.Proxy @Newtypes.CommaVCat) xs
-    )
-      . fmap (Pretty.prettyVersioned @b v . Newtype.pack)
-      . Set.toAscList
-      . Newtype.unpack
diff --git a/source/library/CabalGild/Unstable/Type/SomeParsecParser.hs b/source/library/CabalGild/Unstable/Type/SomeParsecParser.hs
--- a/source/library/CabalGild/Unstable/Type/SomeParsecParser.hs
+++ b/source/library/CabalGild/Unstable/Type/SomeParsecParser.hs
@@ -8,7 +8,6 @@
 module CabalGild.Unstable.Type.SomeParsecParser where
 
 import qualified CabalGild.Unstable.Type.List as List
-import qualified CabalGild.Unstable.Type.Set as Set
 import qualified Distribution.CabalSpecVersion as CabalSpecVersion
 import qualified Distribution.Parsec as Parsec
 import qualified Distribution.Pretty as Pretty
@@ -28,20 +27,10 @@
 list ::
   forall s b a.
   (Parsec.Parsec (List.List s b a), Pretty.Pretty (List.List s b a)) =>
+  (List.List s b a -> List.List s b a) ->
   SomeParsecParser
-list =
+list f =
   SomeParsecParser
     { parsec = Parsec.parsec @(List.List s b a),
-      pretty = Pretty.prettyVersioned
-    }
-
--- | Creates a new parser for the given 'Set.Set' of values.
-set ::
-  forall s b a.
-  (Parsec.Parsec (Set.Set s b a), Pretty.Pretty (Set.Set s b a)) =>
-  SomeParsecParser
-set =
-  SomeParsecParser
-    { parsec = Parsec.parsec @(Set.Set s b a),
-      pretty = Pretty.prettyVersioned
+      pretty = \v -> Pretty.prettyVersioned v . f
     }
diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs
--- a/source/test-suite/Main.hs
+++ b/source/test-suite/Main.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# OPTIONS_GHC -O0 #-}
 
 import qualified CabalGild.Unstable.Action.EvaluatePragmas.Version as Version
 import qualified CabalGild.Unstable.Class.MonadHandle as MonadHandle
@@ -913,6 +914,11 @@
       "library\n exposed-modules: N M"
       "library\n  exposed-modules:\n    M\n    N\n"
 
+  Hspec.it "sorts exposed-modules case insensitively" $ do
+    expectGilded
+      "library\n exposed-modules: MB Ma"
+      "library\n  exposed-modules:\n    Ma\n    MB\n"
+
   Hspec.it "sorts reexported-modules" $ do
     expectGilded
       "library\n reexported-modules: p:M4 as M5, M2 as M3, q:M6, M1"
@@ -923,6 +929,11 @@
       "library\n signatures: N M"
       "library\n  signatures:\n    M\n    N\n"
 
+  Hspec.it "sorts signatures case insensitively" $ do
+    expectGilded
+      "library\n signatures: MB Ma"
+      "library\n  signatures:\n    Ma\n    MB\n"
+
   Hspec.it "sorts build-tools" $ do
     expectGilded
       "library\n build-tools: q , p == 1"
@@ -990,16 +1001,31 @@
       "library\n other-modules: N M"
       "library\n  other-modules:\n    M\n    N\n"
 
+  Hspec.it "sorts other-modules case insensitively" $ do
+    expectGilded
+      "library\n other-modules: MB Ma"
+      "library\n  other-modules:\n    Ma\n    MB\n"
+
   Hspec.it "sorts virtual-modules" $ do
     expectGilded
       "library\n virtual-modules: N M"
       "library\n  virtual-modules:\n    M\n    N\n"
 
+  Hspec.it "sorts virtual-modules case insensitively" $ do
+    expectGilded
+      "library\n virtual-modules: MB Ma"
+      "library\n  virtual-modules:\n    Ma\n    MB\n"
+
   Hspec.it "sorts autogen-modules" $ do
     expectGilded
       "library\n autogen-modules: N M"
       "library\n  autogen-modules:\n    M\n    N\n"
 
+  Hspec.it "sorts autogen-modules case insensitively" $ do
+    expectGilded
+      "library\n autogen-modules: MB Ma"
+      "library\n  autogen-modules:\n    Ma\n    MB\n"
+
   Hspec.it "sorts other-languages" $ do
     expectGilded
       "library\n other-languages: b a"
@@ -2143,6 +2169,341 @@
       expectGilded
         "build-depends: x (>= 1) && (< 2)"
         "build-depends: x (>=1) && (<2)\n"
+
+  Hspec.describe "fields" $ do
+    Hspec.describe "asm-options" $ do
+      Hspec.it "does not deduplicate" $ do
+        expectGilded "asm-options: a a" "asm-options:\n  a\n  a\n"
+
+      Hspec.it "does not sort" $ do
+        expectGilded "asm-options: b a" "asm-options:\n  b\n  a\n"
+
+    Hspec.describe "asm-sources" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "asm-sources: a a" "asm-sources: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "asm-sources: B a" "asm-sources:\n  a\n  B\n"
+
+    Hspec.describe "autogen-includes" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "autogen-includes: a a" "autogen-includes: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "autogen-includes: B a" "autogen-includes:\n  a\n  B\n"
+
+    Hspec.describe "autogen-modules" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "autogen-modules: A A" "autogen-modules: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "autogen-modules: AB Aa" "autogen-modules:\n  Aa\n  AB\n"
+
+    Hspec.describe "build-depends" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "build-depends: a, a" "build-depends: a\n"
+
+      Hspec.it "sorts packages" $ do
+        expectGilded "build-depends: B, a" "build-depends:\n  a,\n  B\n"
+
+      Hspec.it "sorts components" $ do
+        expectGilded "cabal-version: 3.0\nbuild-depends: a:C, a:b" "cabal-version: 3.0\nbuild-depends:\n  a:b,\n  a:C,\n"
+
+      Hspec.it "sorts multiple components" $ do
+        expectGilded "cabal-version: 3.0\nbuild-depends: a:{C, b}" "cabal-version: 3.0\nbuild-depends: a:{b, C}\n"
+
+      Hspec.it "sorts varieties" $ do
+        -- These are ordered roughly from least to most complex.
+        --
+        -- Even though `a:a` and `a:{a}` are semantically identical, they do
+        -- not get deduplicated.
+        expectGilded "cabal-version: 3.0\nbuild-depends: a:a, a:{a}, a" "cabal-version: 3.0\nbuild-depends:\n  a,\n  a:a,\n  a:{a},\n"
+
+    Hspec.describe "build-tool-depends" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "build-tool-depends: p:c, p:c" "build-tool-depends: p:c\n"
+
+      Hspec.it "sorts packages" $ do
+        expectGilded "build-tool-depends: B:c, a:c" "build-tool-depends:\n  a:c,\n  B:c\n"
+
+      Hspec.it "sorts components" $ do
+        expectGilded "build-tool-depends: a:C, a:b" "build-tool-depends:\n  a:b,\n  a:C\n"
+
+    Hspec.describe "build-tools" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "build-tools: p, p" "build-tools: p >=0\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "build-tools: B, a" "build-tools:\n  a >=0,\n  B >=0\n"
+
+    Hspec.describe "c-sources" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "c-sources: a a" "c-sources: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "c-sources: B a" "c-sources:\n  a\n  B\n"
+
+    Hspec.describe "cmm-sources" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "cmm-sources: a a" "cmm-sources: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "cmm-sources: B a" "cmm-sources:\n  a\n  B\n"
+
+    Hspec.describe "cxx-sources" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "cxx-sources: a a" "cxx-sources: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "cxx-sources: B a" "cxx-sources:\n  a\n  B\n"
+
+    Hspec.describe "data-files" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "data-files: a a" "data-files: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "data-files: B a" "data-files:\n  a\n  B\n"
+
+    Hspec.describe "default-extensions" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "default-extensions: A A" "default-extensions: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "default-extensions: AB Aa" "default-extensions:\n  Aa\n  AB\n"
+
+    Hspec.describe "exposed-modules" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "exposed-modules: A A" "exposed-modules: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "exposed-modules: AB Aa" "exposed-modules:\n  Aa\n  AB\n"
+
+    Hspec.describe "extensions" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extensions: A A" "extensions: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extensions: AB Aa" "extensions:\n  Aa\n  AB\n"
+
+    Hspec.describe "extra-bundled-libraries" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-bundled-libraries: a a" "extra-bundled-libraries: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-bundled-libraries: B a" "extra-bundled-libraries:\n  a\n  B\n"
+
+    Hspec.describe "extra-doc-files" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-doc-files: a a" "extra-doc-files: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-doc-files: B a" "extra-doc-files:\n  a\n  B\n"
+
+    Hspec.describe "extra-dynamic-library-flavours" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-dynamic-library-flavours: a a" "extra-dynamic-library-flavours: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-dynamic-library-flavours: B a" "extra-dynamic-library-flavours:\n  a\n  B\n"
+
+    Hspec.describe "extra-framework-dirs" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-framework-dirs: a a" "extra-framework-dirs: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-framework-dirs: B a" "extra-framework-dirs:\n  a\n  B\n"
+
+    Hspec.describe "extra-ghci-libraries" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-ghci-libraries: a a" "extra-ghci-libraries: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-ghci-libraries: B a" "extra-ghci-libraries:\n  a\n  B\n"
+
+    Hspec.describe "extra-lib-dirs" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-lib-dirs: a a" "extra-lib-dirs: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-lib-dirs: B a" "extra-lib-dirs:\n  a\n  B\n"
+
+    Hspec.describe "extra-lib-dirs-static" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-lib-dirs-static: a a" "extra-lib-dirs-static: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-lib-dirs-static: B a" "extra-lib-dirs-static:\n  a\n  B\n"
+
+    Hspec.describe "extra-libraries" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-libraries: a a" "extra-libraries: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-libraries: B a" "extra-libraries:\n  a\n  B\n"
+
+    Hspec.describe "extra-libraries-static" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-libraries-static: a a" "extra-libraries-static: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-libraries-static: B a" "extra-libraries-static:\n  a\n  B\n"
+
+    Hspec.describe "extra-library-flavours" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-library-flavours: a a" "extra-library-flavours: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-library-flavours: B a" "extra-library-flavours:\n  a\n  B\n"
+
+    Hspec.describe "extra-source-files" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-source-files: a a" "extra-source-files: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-source-files: B a" "extra-source-files:\n  a\n  B\n"
+
+    Hspec.describe "extra-tmp-files" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "extra-tmp-files: a a" "extra-tmp-files: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "extra-tmp-files: B a" "extra-tmp-files:\n  a\n  B\n"
+
+    Hspec.describe "frameworks" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "frameworks: a a" "frameworks: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "frameworks: B a" "frameworks:\n  a\n  B\n"
+
+    Hspec.describe "include-dirs" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "include-dirs: a a" "include-dirs: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "include-dirs: B a" "include-dirs:\n  a\n  B\n"
+
+    Hspec.describe "includes" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "includes: a a" "includes: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "includes: B a" "includes:\n  a\n  B\n"
+
+    Hspec.describe "install-includes" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "install-includes: a a" "install-includes: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "install-includes: B a" "install-includes:\n  a\n  B\n"
+
+    Hspec.describe "js-sources" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "js-sources: a a" "js-sources: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "js-sources: B a" "js-sources:\n  a\n  B\n"
+
+    Hspec.describe "license-files" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "license-files: a a" "license-files: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "license-files: B a" "license-files:\n  a\n  B\n"
+
+    Hspec.describe "mixins" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "mixins: a, a" "mixins: a\n"
+
+      Hspec.it "sorts packages" $ do
+        expectGilded "mixins: B, a" "mixins:\n  a,\n  B\n"
+
+      Hspec.it "sorts modules" $ do
+        expectGilded "mixins: a (AB, Aa)" "mixins: a (Aa, AB)\n"
+
+      Hspec.it "sorts hiding" $ do
+        expectGilded "mixins: a hiding (AB, Aa)" "mixins: a hiding (Aa, AB)\n"
+
+    Hspec.describe "options" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "options: standalone standalone" "options: standalone\n"
+
+      Hspec.it "sorts" $ do
+        -- `ForeignLibOption` only has one constructor, so we can't actually
+        -- test this.
+        expectGilded "options: standalone" "options: standalone\n"
+
+    Hspec.describe "other-extensions" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "other-extensions: A A" "other-extensions: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "other-extensions: AB Aa" "other-extensions:\n  Aa\n  AB\n"
+
+    Hspec.describe "other-languages" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "other-languages: A A" "other-languages: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "other-languages: AB Aa" "other-languages:\n  Aa\n  AB\n"
+
+    Hspec.describe "other-modules" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "other-modules: A A" "other-modules: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "other-modules: AB Aa" "other-modules:\n  Aa\n  AB\n"
+
+    Hspec.describe "pkgconfig-depends" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "pkgconfig-depends: a, a" "pkgconfig-depends: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "pkgconfig-depends: B, a" "pkgconfig-depends:\n  a,\n  B\n"
+
+    Hspec.describe "reexported-modules" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "reexported-modules: A, A" "reexported-modules: A\n"
+
+      Hspec.it "sorts modules" $ do
+        expectGilded "reexported-modules: AB, Aa" "reexported-modules:\n  Aa,\n  AB\n"
+
+      Hspec.it "sorts aliases" $ do
+        expectGilded "reexported-modules: A as AB, A as Aa" "reexported-modules:\n  A as Aa,\n  A as AB\n"
+
+      Hspec.it "sorts packages" $ do
+        expectGilded "reexported-modules: B:C, a:C" "reexported-modules:\n  a:C,\n  B:C\n"
+
+      Hspec.it "sorts unqualified before qualified" $ do
+        expectGilded "reexported-modules: a:A, A" "reexported-modules:\n  A,\n  a:A\n"
+
+    Hspec.describe "setup-depends" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "setup-depends: a, a" "setup-depends: a\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "setup-depends: B, a" "setup-depends:\n  a,\n  B\n"
+
+    Hspec.describe "signatures" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "signatures: A A" "signatures: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "signatures: AB Aa" "signatures:\n  Aa\n  AB\n"
+
+    Hspec.describe "tested-with" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "tested-with: ghc ghc" "tested-with: ghc\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "tested-with: B a" "tested-with:\n  a\n  B\n"
+
+    Hspec.describe "virtual-modules" $ do
+      Hspec.it "deduplicates" $ do
+        expectGilded "virtual-modules: A A" "virtual-modules: A\n"
+
+      Hspec.it "sorts" $ do
+        expectGilded "virtual-modules: AB Aa" "virtual-modules:\n  Aa\n  AB\n"
 
   Hspec.around_ withTemporaryDirectory
     . Hspec.it "discovers modules on the file system"
