diff --git a/Cabal/Distribution/PackageDescription/Check.hs b/Cabal/Distribution/PackageDescription/Check.hs
index 7bc89546285d4fbd6bdec7285b044db7118689df..ee9fd817ca76bb044e00579d4bff9dcdeb91567b 100644
--- a/Cabal/Distribution/PackageDescription/Check.hs
+++ b/Cabal/Distribution/PackageDescription/Check.hs
@@ -53,7 +53,6 @@ import Distribution.System
 import Distribution.Text
 import Distribution.Types.ComponentRequestedSpec
 import Distribution.Types.CondTree
-import Distribution.Types.ExecutableScope
 import Distribution.Types.ExeDependency
 import Distribution.Types.UnqualComponentName
 import Distribution.Utils.Generic                    (isAscii)
@@ -315,12 +314,6 @@ checkExecutable pkg exe =
       PackageBuildImpossible $
            "On executable '" ++ display (exeName exe) ++ "' an 'autogen-module' is not "
         ++ "on 'other-modules'"
-
-  , checkSpecVersion pkg [2,0] (exeScope exe /= ExecutableScopeUnknown) $
-      PackageDistSuspiciousWarn $
-           "To use the 'scope' field the package needs to specify "
-        ++ "at least 'cabal-version: >= 2.0'."
-
   ]
   where
     moduleDuplicates = dups (exeModules exe)
diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
index 605e47a21714dc549c7accec7cd6be18e04b0e57..008b5525ea53b4e6df6b73f1fcf1f3c01ef7dbc9 100644
--- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs
+++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs
@@ -52,6 +52,7 @@ import Distribution.Parsec.Common
 import Distribution.Parsec.Newtypes
 import Distribution.Parsec.ParseResult
 import Distribution.Text                      (display)
+import Distribution.Types.ExecutableScope
 import Distribution.Types.ForeignLib
 import Distribution.Types.ForeignLibType
 import Distribution.Types.UnqualComponentName
@@ -159,7 +160,8 @@ executableFieldGrammar
 executableFieldGrammar n = Executable n
     -- main-is is optional as conditional blocks don't have it
     <$> optionalFieldDefAla "main-is" FilePathNT L.modulePath ""
-    <*> monoidalField       "scope"              L.exeScope
+    <*> optionalFieldDef    "scope"              L.exeScope ExecutablePublic
+        ^^^ availableSince [2,0] ExecutablePublic
     <*> blurFieldGrammar L.buildInfo buildInfoFieldGrammar
 {-# SPECIALIZE executableFieldGrammar :: UnqualComponentName -> ParsecFieldGrammar' Executable #-}
 {-# SPECIALIZE executableFieldGrammar :: UnqualComponentName -> PrettyFieldGrammar' Executable #-}
diff --git a/Cabal/Distribution/Types/ExecutableScope.hs b/Cabal/Distribution/Types/ExecutableScope.hs
index 87ab1f1015d06464f6b306382cde5ea25b045e3f..4271f15b6be5c3b12d7fe6080012dbb899aa3701 100644
--- a/Cabal/Distribution/Types/ExecutableScope.hs
+++ b/Cabal/Distribution/Types/ExecutableScope.hs
@@ -16,23 +16,18 @@ import qualified Distribution.Compat.CharParsing as P
 import qualified Distribution.Compat.ReadP as Parse
 import qualified Text.PrettyPrint as Disp
 
-data ExecutableScope = ExecutableScopeUnknown
-                     | ExecutablePublic
+data ExecutableScope = ExecutablePublic
                      | ExecutablePrivate
     deriving (Generic, Show, Read, Eq, Typeable, Data)
 
 instance Pretty ExecutableScope where
     pretty ExecutablePublic       = Disp.text "public"
     pretty ExecutablePrivate      = Disp.text "private"
-    pretty ExecutableScopeUnknown = Disp.text "unknown"
 
 instance Parsec ExecutableScope where
-    parsec = do
-        name <- P.munch1 (\c -> isAlphaNum c || c == '-')
-        return $ case name of
-              "public"  -> ExecutablePublic
-              "private" -> ExecutablePrivate
-              _         -> ExecutableScopeUnknown
+    parsec = P.try pub <|> pri where
+        pub = ExecutablePublic  <$ P.string "public"
+        pri = ExecutablePrivate <$ P.string "private"
 
 instance Text ExecutableScope where
     parse = Parse.choice
@@ -44,12 +39,12 @@ instance Binary ExecutableScope
 
 instance NFData ExecutableScope where rnf = genericRnf
 
+-- | 'Any' like semigroup, where 'ExecutablePrivate' is 'Any True'
+instance Semigroup ExecutableScope where
+    ExecutablePublic    <> x = x
+    x@ExecutablePrivate <> _ = x
+
+-- | 'mempty' = 'ExecutablePublic'
 instance Monoid ExecutableScope where
-    mempty = ExecutableScopeUnknown
+    mempty = ExecutablePublic
     mappend = (<>)
-
-instance Semigroup ExecutableScope where
-    ExecutableScopeUnknown <> x = x
-    x <> ExecutableScopeUnknown = x
-    x <> y | x == y             = x
-           | otherwise          = error "Ambiguous executable scope"
diff --git a/Cabal/tests/ParserTests/regressions/issue-5055.expr b/Cabal/tests/ParserTests/regressions/issue-5055.expr
index df261f2870dbf4fcc3b54050c9058fbd085160ca..a1e234adc4eab59851db19f83d912df958da4cd6 100644
--- a/Cabal/tests/ParserTests/regressions/issue-5055.expr
+++ b/Cabal/tests/ParserTests/regressions/issue-5055.expr
@@ -59,7 +59,7 @@ GenericPackageDescription
                                                                                           `mkVersion [5]`))],
                                                             virtualModules = []},
                                              exeName = `UnqualComponentName "flag-test-exe"`,
-                                             exeScope = ExecutableScopeUnknown,
+                                             exeScope = ExecutablePublic,
                                              modulePath = "FirstMain.hs"}}],
    condForeignLibs = [],
    condLibrary = Nothing,
diff --git a/Cabal/tests/ParserTests/regressions/issue-5055.format b/Cabal/tests/ParserTests/regressions/issue-5055.format
index d296518bb92bdec2d9f4221eeb9ad6d247ca3634..558c0c371e58351fb8b866fcb978cf32931d73e0 100644
--- a/Cabal/tests/ParserTests/regressions/issue-5055.format
+++ b/Cabal/tests/ParserTests/regressions/issue-5055.format
@@ -10,7 +10,6 @@ build-type: Simple
 
 executable flag-test-exe
     main-is: FirstMain.hs
-    scope: unknown
     default-language: Haskell2010
     build-depends:
         base >=4.8 && <5
diff --git a/Cabal/tests/ParserTests/regressions/shake.expr b/Cabal/tests/ParserTests/regressions/shake.expr
index 06ae41735c5021615950e9516fa6c24af3c6d176..b0927b700256418194097df8c792c14f449ff046 100644
--- a/Cabal/tests/ParserTests/regressions/shake.expr
+++ b/Cabal/tests/ParserTests/regressions/shake.expr
@@ -56,7 +56,7 @@ GenericPackageDescription
                                                                                                            targetBuildDepends = [],
                                                                                                            virtualModules = []},
                                                                                             exeName = `UnqualComponentName "shake"`,
-                                                                                            exeScope = ExecutableScopeUnknown,
+                                                                                            exeScope = ExecutablePublic,
                                                                                             modulePath = ""}}},
                                                  CondBranch
                                                    {condBranchCondition = `Var (Flag (FlagName "portable"))`,
@@ -118,7 +118,7 @@ GenericPackageDescription
                                                                                                                                                                                         `mkVersion [2,5,1]`)],
                                                                                                                                                              virtualModules = []},
                                                                                                                                               exeName = `UnqualComponentName "shake"`,
-                                                                                                                                              exeScope = ExecutableScopeUnknown,
+                                                                                                                                              exeScope = ExecutablePublic,
                                                                                                                                               modulePath = ""}}}],
                                                                              condTreeConstraints = [],
                                                                              condTreeData = Executable
@@ -165,7 +165,7 @@ GenericPackageDescription
                                                                                                               targetBuildDepends = [],
                                                                                                               virtualModules = []},
                                                                                                exeName = `UnqualComponentName "shake"`,
-                                                                                               exeScope = ExecutableScopeUnknown,
+                                                                                               exeScope = ExecutablePublic,
                                                                                                modulePath = ""}},
                                                     condBranchIfTrue = CondNode
                                                                          {condTreeComponents = [CondBranch
@@ -222,7 +222,7 @@ GenericPackageDescription
                                                                                                                                                                                   AnyVersion],
                                                                                                                                                           virtualModules = []},
                                                                                                                                            exeName = `UnqualComponentName "shake"`,
-                                                                                                                                           exeScope = ExecutableScopeUnknown,
+                                                                                                                                           exeScope = ExecutablePublic,
                                                                                                                                            modulePath = ""}}}],
                                                                           condTreeConstraints = [],
                                                                           condTreeData = Executable
@@ -269,7 +269,7 @@ GenericPackageDescription
                                                                                                            targetBuildDepends = [],
                                                                                                            virtualModules = []},
                                                                                             exeName = `UnqualComponentName "shake"`,
-                                                                                            exeScope = ExecutableScopeUnknown,
+                                                                                            exeScope = ExecutablePublic,
                                                                                             modulePath = ""}}},
                                                  CondBranch
                                                    {condBranchCondition = `CNot (Var (OS Windows))`,
@@ -325,7 +325,7 @@ GenericPackageDescription
                                                                                                                                    AnyVersion],
                                                                                                            virtualModules = []},
                                                                                             exeName = `UnqualComponentName "shake"`,
-                                                                                            exeScope = ExecutableScopeUnknown,
+                                                                                            exeScope = ExecutablePublic,
                                                                                             modulePath = ""}}}],
                            condTreeConstraints = [Dependency
                                                     `PackageName "base"`
@@ -520,7 +520,7 @@ GenericPackageDescription
                                                                                     AnyVersion],
                                                             virtualModules = []},
                                              exeName = `UnqualComponentName "shake"`,
-                                             exeScope = ExecutableScopeUnknown,
+                                             exeScope = ExecutablePublic,
                                              modulePath = "Run.hs"}}],
    condForeignLibs = [],
    condLibrary = Just
diff --git a/Cabal/tests/ParserTests/regressions/shake.format b/Cabal/tests/ParserTests/regressions/shake.format
index 22578dcd1f076dbffce4e4dcab45f8d633e860b6..c646143465c4f6e9b33ca72374f4317a838fde5b 100644
--- a/Cabal/tests/ParserTests/regressions/shake.format
+++ b/Cabal/tests/ParserTests/regressions/shake.format
@@ -169,7 +169,6 @@ library
 
 executable shake
     main-is: Run.hs
-    scope: unknown
     hs-source-dirs: src
     other-modules:
         Development.Make.All
@@ -249,27 +248,21 @@ executable shake
         primitive -any
     
     if impl(ghc >=7.8)
-        scope: unknown
         ghc-options: -threaded "-with-rtsopts=-I0 -qg -qb"
     
     if flag(portable)
-        scope: unknown
         cpp-options: -DPORTABLE
         
         if impl(ghc <7.6)
-            scope: unknown
             build-depends:
                 old-time -any
     else
-        scope: unknown
         
         if !os(windows)
-            scope: unknown
             build-depends:
                 unix >=2.5.1
     
     if !os(windows)
-        scope: unknown
         build-depends:
             unix -any
 
diff --git a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
index 3ae10aece8983076e0ebb747165a04da6ba82f3b..371992839595c60a4f5ddda9d5cf5695df7c25d9 100644
--- a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
+++ b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr
@@ -66,7 +66,7 @@ GenericPackageDescription
                                                                                     AnyVersion],
                                                             virtualModules = []},
                                              exeName = `UnqualComponentName "wl-pprint-string-example"`,
-                                             exeScope = ExecutableScopeUnknown,
+                                             exeScope = ExecutablePublic,
                                              modulePath = "Main.hs"}}],
    condForeignLibs = [],
    condLibrary = Just
diff --git a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format
index 59a460f2fb91a10580f450dafd5fed477a5a99ba..64a5c54c8e8af2ce941d6b4319201079f1fdd0e9 100644
--- a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format
+++ b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format
@@ -29,7 +29,6 @@ library
 
 executable wl-pprint-string-example
     main-is: Main.hs
-    scope: unknown
     hs-source-dirs: example-string
     other-modules:
         StringImpl
diff --git a/Makefile b/Makefile
index b99cbb3524003f3f7f6897ab698de75a88a11edb..4c338c935dfe490d58cc7d20b4c6da71f0380277 100644
--- a/Makefile
+++ b/Makefile
@@ -33,3 +33,7 @@ doctest :
 gen-extra-source-files:
 	cabal new-run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-extra-source-files -- Cabal/Cabal.cabal
 	cabal new-run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-extra-source-files -- cabal-install/cabal-install.cabal
+
+cabal-install-test:
+	cabal new-build cabal cabal-tests
+	cd cabal-testsuite && `cabal-plan list-bin cabal-tests` --with-cabal=`cabal-plan list-bin cabal` --hide-successes -j3