diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Revision history for config-schema
 
+## 1.1.0.0
+
+* Simplify field types of `ValueSpecMismatch`
+* More aggressively eliminate `TypeMismatch` and `WrongAtom`
+  when other, more specific errors, are available.
+
 ## 1.0.0.0
 
 * Rename `ValueSpec` to `PrimValueSpec`
diff --git a/config-schema.cabal b/config-schema.cabal
--- a/config-schema.cabal
+++ b/config-schema.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                config-schema
-version:             1.0.0.0
+version:             1.1.0.0
 synopsis:            Schema definitions for the config-value package
 description:         This package makes it possible to defined schemas for use when
                      loading configuration files using the config-value format.
diff --git a/src/Config/Schema/Load.hs b/src/Config/Schema/Load.hs
--- a/src/Config/Schema/Load.hs
+++ b/src/Config/Schema/Load.hs
@@ -80,7 +80,7 @@
 
 
 getValue :: ValueSpec a -> Value p -> Except (ValueSpecMismatch p) a
-getValue s v = withExcept (ValueSpecMismatch v) (runValueSpec (getValue1 v) s)
+getValue s v = withExcept (ValueSpecMismatch (valueAnn v) (describeValue v)) (runValueSpec (getValue1 v) s)
 
 -- | Match a 'Value' against a 'ValueSpec' given a wrapper for any nested
 -- mismatch errors that might occur.
@@ -89,7 +89,7 @@
   ValueSpec a ->
   Value p ->
   Except (Problem p) a
-getValue' p s v = withExcept (p . ValueSpecMismatch v) (runValueSpec (getValue1 v) s)
+getValue' p s v = withExcept (p . ValueSpecMismatch (valueAnn v) (describeValue v)) (runValueSpec (getValue1 v) s)
 
 getValue1 :: Value p -> PrimValueSpec a -> Except (NonEmpty (PrimMismatch p)) a
 getValue1 v prim = withExcept (pure . PrimMismatch (describeSpec prim))
diff --git a/src/Config/Schema/Load/Error.hs b/src/Config/Schema/Load/Error.hs
--- a/src/Config/Schema/Load/Error.hs
+++ b/src/Config/Schema/Load/Error.hs
@@ -53,7 +53,7 @@
 -- | Newtype wrapper for schema load errors.
 data ValueSpecMismatch p =
   -- | Problem value and list of specification failures
-  ValueSpecMismatch (Value p) (NonEmpty (PrimMismatch p))
+  ValueSpecMismatch p Text (NonEmpty (PrimMismatch p))
   deriving Show
 
 -- | Type for errors that can be encountered while decoding a value according
@@ -91,11 +91,11 @@
 describeSpec (NamedSpec name _)         = name
 
 -- | Describe outermost shape of a 'Value'
-describeValue :: Value p -> String
+describeValue :: Value p -> Text
 describeValue Text{}     = "text"
 describeValue Number{}   = "integer"
 describeValue Floating{} = "number"
-describeValue (Atom _ a) = "atom `" <> Text.unpack (atomName a) <> "`"
+describeValue (Atom _ a) = "atom `" <> atomName a <> "`"
 describeValue Sections{} = "sections"
 describeValue List{}     = "list"
 
@@ -103,7 +103,7 @@
 rewriteMismatch ::
   (ValueSpecMismatch p -> ValueSpecMismatch p) ->
   ValueSpecMismatch p -> ValueSpecMismatch p
-rewriteMismatch f (ValueSpecMismatch v prims) = f (ValueSpecMismatch v (fmap aux1 prims))
+rewriteMismatch f (ValueSpecMismatch p v prims) = f (ValueSpecMismatch p v (fmap aux1 prims))
   where
     aux1 (PrimMismatch spec prob) = PrimMismatch spec (aux2 prob)
 
@@ -112,21 +112,31 @@
     aux2 (NestedProblem        y) = NestedProblem        (rewriteMismatch f y)
     aux2 prob                     = prob
 
+
 -- | Single-step rewrite that removes type-mismatch problems if there
 -- are non-mismatches available to focus on.
 removeTypeMismatch1 :: ValueSpecMismatch p -> ValueSpecMismatch p
-removeTypeMismatch1 (ValueSpecMismatch v xs)
-  | Just xs' <- NonEmpty.nonEmpty (NonEmpty.filter isNotTypeMismatch xs)
-  = ValueSpecMismatch v xs'
-  where
-    isNotTypeMismatch (PrimMismatch _ TypeMismatch) = False
-    isNotTypeMismatch _                             = True
+removeTypeMismatch1 (ValueSpecMismatch p v xs)
+  | Just xs' <- NonEmpty.nonEmpty (NonEmpty.filter (not . isTypeMismatch) xs)
+  = ValueSpecMismatch p v xs'
 removeTypeMismatch1 v = v
 
+isTypeMismatch :: PrimMismatch p -> Bool
+isTypeMismatch (PrimMismatch _ prob) =
+  case prob of
+    WrongAtom -> True
+    TypeMismatch -> True
+    NestedProblem x -> go x
+    SubkeyProblem _ x -> go x
+    ListElementProblem _ x -> go x
+    _ -> False
+  where
+    go (ValueSpecMismatch _ _ xs) = all isTypeMismatch xs
+
 -- | Single-step rewrite that removes mismatches with only a single,
 -- nested mismatch below them.
 focusMismatch1 :: ValueSpecMismatch p -> ValueSpecMismatch p
-focusMismatch1 x@(ValueSpecMismatch _ prims)
+focusMismatch1 x@(ValueSpecMismatch _ _ prims)
   | PrimMismatch _ problem :| [] <- prims
   , Just sub <- simplify1 problem = sub
   | otherwise = x
@@ -141,10 +151,10 @@
 -- and type of value that failed to match along with details about
 -- each specification that it didn't match.
 prettyValueSpecMismatch :: ErrorAnnotation p => ValueSpecMismatch p -> Doc
-prettyValueSpecMismatch (ValueSpecMismatch v es) =
+prettyValueSpecMismatch (ValueSpecMismatch p v es) =
   heading $+$ errors
   where
-    heading = displayAnnotation (valueAnn v) <> text (describeValue v)
+    heading = displayAnnotation p <> text (Text.unpack v)
     errors = vcat (map prettyPrimMismatch (toList es))
 
 
diff --git a/src/Config/Schema/Types.hs b/src/Config/Schema/Types.hs
--- a/src/Config/Schema/Types.hs
+++ b/src/Config/Schema/Types.hs
@@ -12,7 +12,7 @@
 Specifications can be defined using "Config.Schema.Spec" and can be consumed
 with "Config.Schema.Load" and "Config.Schema.Doc".
 
-This module defines high-level 'ValueSpec' and 'SectionsSpec' types that are
+This module defines high-level 'ValueSpec' and @SectionsSpec@ types that are
 intended to be used by normal library users. This types are implemented in
 terms of primitive 'PrimValueSpec' and 'PrimSectionSpec' types. These
 primitives are what consumers of specifications will need to use.
@@ -93,6 +93,8 @@
 -- way to specify expected values.
 --
 -- Multiple specifications can be combined using this type's 'Alt' instance.
+--
+-- To create 'ValueSpec' values see "Config.Schema.Spec"
 newtype ValueSpec a = MkValueSpec
   { unValueSpec :: NonEmpty (Coyoneda PrimValueSpec a) }
   deriving (Functor)
@@ -151,6 +153,8 @@
 -- | A list of section specifications used to process a whole group of
 -- key-value pairs. Multiple section specifications can be combined
 -- using this type's 'Applicative' instance.
+--
+-- To create @SectionsSpec@ values see "Config.Schema.Spec"
 newtype SectionsSpec a = MkSectionsSpec (Ap PrimSectionSpec a)
   deriving (Functor, Applicative)
 
@@ -162,7 +166,7 @@
 primSectionsSpec = MkSectionsSpec . liftAp
 
 -- | Given an function that handles a single, primitive section specification;
--- 'runSections' will generate one that processes a whole 'SectionsSpec'.
+-- 'runSections' will generate one that processes a whole @SectionsSpec@.
 --
 -- The results from each section will be sequence together using the 'Applicative'
 -- instance in of the result type, and the results can be indexed by the type
@@ -174,7 +178,7 @@
 
 
 -- | Given an function that handles a single, primitive section specification;
--- 'runSections_' will generate one that processes a whole 'SectionsSpec'.
+-- 'runSections_' will generate one that processes a whole @SectionsSpec@.
 --
 -- The results from each section will be sequence together using the 'Monoid'
 -- instance in of the result type, and the results will not be indexed by the
