diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Version history for ghcup
 
+## 0.2.6.2 -- 2026-06-16
+
+* Fix X.Y symlinks wrt [#1365](https://github.com/haskell/ghcup-hs/issues/1365)
+* Provide a way to filter by target when invoking `ghcup list` [#1362](https://github.com/haskell/ghcup-hs/issues/1362)
+* Introduce `ghcup fixup` [#1369](https://github.com/haskell/ghcup-hs/issues/1369)
+
 ## 0.2.6.1 -- 2026-06-13
 
 ### Bugfixes affecting VSCode
diff --git a/app/ghcup/Main.hs b/app/ghcup/Main.hs
--- a/app/ghcup/Main.hs
+++ b/app/ghcup/Main.hs
@@ -332,6 +332,7 @@
             Run runCommand             -> run runCommand settings (getAppState_and_updateCheckAction, leanAppstate)
             PrintAppErrors             -> putStrLn allHFError >> pure ExitSuccess
             HealthCheck hcCommands     -> hc hcCommands (getAppState_and_updateCheckAction, leanAppstate)
+            Fixup fixupCommand         -> fixup fixupCommand (getAppState_and_updateCheckAction, leanAppstate)
 #if defined(DHALL)
             Generate gen -> generate gen (getAppState_and_updateCheckAction, leanAppstate)
 #endif
diff --git a/ghcup.cabal b/ghcup.cabal
--- a/ghcup.cabal
+++ b/ghcup.cabal
@@ -1,9 +1,9 @@
 cabal-version:      2.4
 name:               ghcup
-version:            0.2.6.1
+version:            0.2.6.2
 license:            LGPL-3.0-only
 license-file:       LICENSE
-copyright:          Julian Ospald 2024
+copyright:          Julian Ospald 2026
 maintainer:         hasufell@posteo.de
 author:             Julian Ospald
 homepage:           https://github.com/haskell/ghcup-hs
@@ -212,6 +212,7 @@
     GHCup.Command.Whereis
     GHCup.Command.GC
     GHCup.Command.HealthCheck
+    GHCup.Command.Fixup
     GHCup.Command.Prefetch
     GHCup.Command.Rm
     GHCup.Command.Set
@@ -355,6 +356,7 @@
     GHCup.OptParse.GC
     GHCup.OptParse.Generate
     GHCup.OptParse.HealthCheck
+    GHCup.OptParse.Fixup
     GHCup.OptParse.Install
     GHCup.OptParse.List
     GHCup.OptParse.Nuke
diff --git a/lib-opt/GHCup/OptParse.hs b/lib-opt/GHCup/OptParse.hs
--- a/lib-opt/GHCup/OptParse.hs
+++ b/lib-opt/GHCup/OptParse.hs
@@ -27,6 +27,7 @@
   , module GHCup.OptParse.Generate
 #endif
   , module GHCup.OptParse.HealthCheck
+  , module GHCup.OptParse.Fixup
   , module GHCup.OptParse.DebugInfo
   , module GHCup.OptParse.Nuke
   , module GHCup.OptParse.ToolRequirements
@@ -57,6 +58,7 @@
 import           GHCup.OptParse.Generate
 #endif
 import           GHCup.OptParse.HealthCheck
+import           GHCup.OptParse.Fixup
 import           GHCup.OptParse.DebugInfo
 import           GHCup.OptParse.ToolRequirements
 import           GHCup.OptParse.Nuke
@@ -128,6 +130,7 @@
   | GC GCOptions
   | Run RunOptions
   | HealthCheck HealthCheckCommand
+  | Fixup FixupCommand
   | PrintAppErrors
 
 
@@ -326,6 +329,12 @@
               ( HealthCheck <$>
                info (hcP <**> helper)
                     (progDesc "Health check ghcup")
+              )
+      <> command
+              "fixup"
+              ( Fixup <$>
+               info (fixupP <**> helper)
+                    (progDesc "Fix up issues with installations")
               )
       <> commandGroup "Main commands:"
       )
diff --git a/lib-opt/GHCup/OptParse/Fixup.hs b/lib-opt/GHCup/OptParse/Fixup.hs
new file mode 100644
--- /dev/null
+++ b/lib-opt/GHCup/OptParse/Fixup.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE CPP               #-}
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE TypeApplications  #-}
+{-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE QuasiQuotes       #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE RankNTypes #-}
+
+module GHCup.OptParse.Fixup where
+
+
+import GHCup.Command.Fixup
+import GHCup.Errors
+import GHCup.Prelude.Logger
+import GHCup.Prelude.String.QQ
+import GHCup.Types
+
+#if !MIN_VERSION_base(4,13,0)
+import           Control.Monad.Fail             ( MonadFail )
+#endif
+import           Control.Monad.Reader
+import           Control.Monad.Trans.Resource
+import           Data.Functor
+import           Data.Variant.Excepts
+import           Options.Applicative     hiding ( style, ParseError )
+import           Prelude                 hiding ( appendFile )
+import           System.Exit
+import Options.Applicative.Pretty.Shim ( text )
+import Control.Exception.Safe (MonadMask)
+
+import qualified Data.Text                     as T
+
+
+
+
+
+    ----------------
+    --[ Commands ]--
+    ----------------
+
+
+data FixupCommand
+  = FixupSymlinks
+  deriving (Eq, Show)
+
+
+
+
+    ---------------
+    --[ Parsers ]--
+    ---------------
+
+
+fixupP :: Parser FixupCommand
+fixupP =
+  subparser
+      (  command
+          "symlinks"
+          (   FixupSymlinks
+          <$ info
+                helper
+                (  progDesc "Fix up symlinks in bin/"
+                <> footerDoc (Just $ text toolFooter)
+                )
+          )
+      )
+ where
+  toolFooter :: String
+  toolFooter = [s|Discussion:
+  Fix up common issues.
+
+Examples:
+  ghcup fixup symlinks|]
+
+
+
+
+
+
+
+    ---------------------------
+    --[ Effect interpreters ]--
+    ---------------------------
+
+
+type FixupEffects = '[MalformedInstallInfo, ParseError]
+
+
+
+
+    ------------------
+    --[ Entrypoint ]--
+    ------------------
+
+
+
+fixup :: ( Monad m
+         , MonadMask m
+         , MonadUnliftIO m
+         , MonadFail m
+         )
+      => FixupCommand
+      -> (IO (AppState, IO ()), LeanAppState)
+      -> m ExitCode
+fixup command' (getAppState', leanAppstate) = run (do
+     case command' of
+       FixupSymlinks ->
+         liftE fixupSymlinks
+   ) >>= \case
+            (VRight _, up) -> do
+              liftIO up
+              pure ExitSuccess
+            (VLeft e, _) -> do
+              runLogger $ logError $ T.pack $ prettyHFError e
+              pure $ ExitFailure 27
+ where
+  runLogger = flip runReaderT leanAppstate
+  run action' = do
+    (appstate', up) <- liftIO getAppState'
+    r <- flip runReaderT appstate'
+                  . runResourceT
+                  . runE
+                    @FixupEffects
+                  $ action'
+    pure (r, up)
+
diff --git a/lib-opt/GHCup/OptParse/List.hs b/lib-opt/GHCup/OptParse/List.hs
--- a/lib-opt/GHCup/OptParse/List.hs
+++ b/lib-opt/GHCup/OptParse/List.hs
@@ -95,10 +95,10 @@
             (eitherReader criteriaParser)
             (  short 'c'
             <> long "show-criteria"
-            <> metavar "<installed|set|available>"
+            <> metavar "<installed|set|available|cross|target=...|tag=...>"
             <> help "Apply filtering criteria, prefix with + or -"
               <> completer (listCompleter
-                [ "+installed", "+set", "+available", "-installed", "-set", "-available"])
+                [ "+installed", "+set", "+available", "+cross", "-installed", "-set", "-available", "-cross"])
             )
           )
     <*> optional
diff --git a/lib-opt/GHCup/OptParse/TUI.hs b/lib-opt/GHCup/OptParse/TUI.hs
--- a/lib-opt/GHCup/OptParse/TUI.hs
+++ b/lib-opt/GHCup/OptParse/TUI.hs
@@ -54,10 +54,10 @@
             (eitherReader criteriaParser)
             (  short 'c'
             <> long "show-criteria"
-            <> metavar "<installed|set|available>"
+            <> metavar "<installed|set|available|cross|target=...|tag=...>"
             <> help "Apply filtering criteria, prefix with + or -"
               <> completer (listCompleter
-                [ "+installed", "+set", "+available", "-installed", "-set", "-available"])
+                [ "+installed", "+set", "+available", "+cross", "-installed", "-set", "-available", "-cross"])
             )
           )
     <*> optional
diff --git a/lib/GHCup/Command/Fixup.hs b/lib/GHCup/Command/Fixup.hs
new file mode 100644
--- /dev/null
+++ b/lib/GHCup/Command/Fixup.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module GHCup.Command.Fixup where
+
+import GHCup.Command.Install.LowLevel
+import GHCup.Command.List
+import GHCup.Errors
+import GHCup.Prelude
+import GHCup.Query.DB
+import GHCup.Query.GHCupDirs
+import GHCup.Types
+import GHCup.Types.Optics
+
+import Control.Monad                  ( forM_, when )
+import Control.Monad.Reader           ( MonadReader )
+import Data.Variant.Excepts
+import Text.PrettyPrint.HughesPJClass ( prettyShow )
+
+import qualified Data.Map.Strict as M
+import qualified Data.Text       as T
+
+
+fixupSymlinks ::
+  ( HasLog env
+  , MonadReader env m
+  , HasDirs env
+  , HasPlatformReq env
+  , HasGHCupInfo env
+  , MonadIOish m
+  )
+  => Excepts '[MalformedInstallInfo, ParseError] m ()
+fixupSymlinks = do
+  Dirs{..} <- getDirs
+  tlr <- liftE $ listVersions Nothing [ListInstalled True] ShowNone False NShowAll (Nothing, Nothing)
+
+  forM_ (M.toList $ M.filterWithKey (\t _ -> t /= ghcup) tlr) $ \(tool, (_mtd, lrs)) ->
+    forM_ lrs $ \ListResult{..} -> do
+      let tver = TargetVersion lCross lVer
+      logInfo $ "Fixing symlinks for " <> T.pack (prettyShow tool) <> " version " <> T.pack (prettyShow tver)
+      idr <- toolInstallDestination tool tver
+      rawSpec <- liftE $ getSymlinkSpecPortable' tool tver
+      when (null rawSpec) $ logWarn $ "Could not find symlink specification in the DB. Consider reinstalling " <> T.pack (prettyShow tool) <> "-" <> T.pack (prettyShow tver)
+      liftE $ symlinkBinaries (GHCupDir idr) rawSpec (GHCupBinDir binDir) tool tver
+
diff --git a/lib/GHCup/Command/Install/LowLevel.hs b/lib/GHCup/Command/Install/LowLevel.hs
--- a/lib/GHCup/Command/Install/LowLevel.hs
+++ b/lib/GHCup/Command/Install/LowLevel.hs
@@ -41,6 +41,7 @@
 import qualified Data.Text             as T
 import qualified System.FilePath.Posix as Posix
 import qualified Text.Megaparsec       as MP
+import Safe (maximumMay)
 
 
 
@@ -271,15 +272,12 @@
   -> TargetVersion
   -> Excepts '[MalformedInstallInfo] m ()
 symlinkBinaries (IsolateDirResolved _) _ _ _ _ = pure ()
-symlinkBinaries (fromInstallDir -> toolDir) rawSpec bindir tool tver = do
+symlinkBinaries idr@(fromInstallDir -> toolDir) rawSpec bindir tool tver = do
   let spec = substituteSpec <$> rawSpec
   forM_ spec safeSpec
   pvpSyms <- lift $ getPVPSymlinks' (fromInstallDir bindir) spec toolDir
   forM_ pvpSyms $ lift . uncurry createLink
-  case bindir of
-    IsolateDirResolved d -> linkMajor d
-    GHCupDir d           -> linkMajor (fromGHCupPath d)
-    GHCupBinDir d        -> whenM (lift isLatest) $ linkMajor d
+  symlinkMajorMinor idr rawSpec bindir tool tver
  where
   safeSpec SymlinkSpec{..} = do
     checkSafePath _slTarget
@@ -290,12 +288,71 @@
 
   checkSafeFilename fp = unless (safeFilename fp) $ throwE (MalformedInstallInfo "'..' or '.' are not allowed and filepath must have no path separators")
 
+
+-- | For the given X.Y version, we
+-- find the latest X.Y.Z and create symlinks.
+fixMajorMinorSymlink ::
+  ( HasLog env
+  , MonadReader env m
+  , HasDirs env   -- createLink needs it on windows
+  , HasPlatformReq env
+  , MonadIOish m
+  )
+  => Tool
+  -> Maybe T.Text
+  -> (Int, Int)
+  -> Excepts '[MalformedInstallInfo, ParseError] m ()
+fixMajorMinorSymlink tool mtarget majorMinor = do
+  Dirs {..}  <- getDirs
+  vers <- lift $ getInstalledVersions tool mtarget
+  let filterMajor = filter (\(getMajorMinorV  . _vrVersion -> mj) -> mj == Just majorMinor)
+  let mLatestMajorVer = fmap _vrVersion $ maximumMay $ filterMajor vers
+  case mLatestMajorVer of
+    Nothing -> pure ()
+    Just latestMajorVer -> do
+      let tver = TargetVersion mtarget latestMajorVer
+      idr <- toolInstallDestination tool tver
+      rawSpec <- liftE $ getSymlinkSpecPortable' tool tver
+      liftE $ symlinkMajorMinor (GHCupDir idr) rawSpec (GHCupBinDir binDir) tool tver
+
+
+-- | Create X.Y major symlinks for the given GHC version, but only
+-- if it is the 'latest' version.
+--
+-- E.g. if we have
+--   * ghc-9.8.3
+--   * ghc-9.8.4
+-- then we want the following symlink:
+--   * ghc-9.8 -> ghc-9.8.4
+symlinkMajorMinor ::
+  ( HasLog env
+  , MonadReader env m
+  , HasDirs env   -- createLink needs it on windows
+  , MonadIOish m
+  )
+  => InstallDirResolved                    -- ^ base dir of the tool
+  -> [SymlinkSpec [Either Char Version]]   -- ^ symlink spec
+  -> InstallDirResolved                    -- ^ binary dir
+  -> Tool
+  -> TargetVersion
+  -> Excepts '[MalformedInstallInfo] m ()
+symlinkMajorMinor (IsolateDirResolved _) _ _ _ _ = pure ()
+symlinkMajorMinor (fromInstallDir -> toolDir) rawSpec bindir tool tver = do
+  case bindir of
+    IsolateDirResolved d -> linkMajor d
+    GHCupDir d           -> linkMajor (fromGHCupPath d)
+    GHCupBinDir d        -> whenM (lift isLatest) $ linkMajor d
+ where
   linkMajor d = do
     let ver = _tvVersion tver
     pvpMajorSyms <- liftE $ getPVPMajorSymlinks' d rawSpec ver toolDir
     forM_ pvpMajorSyms $ lift . uncurry createLink
-  isLatest = do
-    vers <- getInstalledVersions tool (_tvTarget tver)
-    let latestVer = _vrVersion $ maximum vers
-    pure $ latestVer == _tvVersion tver
 
+  isLatest = do
+    case getMajorMinorV (_tvVersion tver) of
+      Just cMJ -> do
+        vers <- getInstalledVersions tool (_tvTarget tver)
+        let filterMajor = filter (\(getMajorMinorV  . _vrVersion -> mj) -> mj == Just cMJ)
+        let latestMajorVer = fmap _vrVersion $ maximumMay $ filterMajor vers
+        pure $ latestMajorVer == Just (_tvVersion tver)
+      Nothing -> pure False
diff --git a/lib/GHCup/Command/List.hs b/lib/GHCup/Command/List.hs
--- a/lib/GHCup/Command/List.hs
+++ b/lib/GHCup/Command/List.hs
@@ -66,6 +66,8 @@
   = ListInstalled Bool
   | ListSet Bool
   | ListAvailable Bool
+  | ListTarget Bool (Maybe Text)
+  | ListTag Bool Tag
   deriving (Eq, Show)
 
 
@@ -356,6 +358,8 @@
     ListInstalled  b -> f b lInstalled
     ListSet        b -> f b lSet
     ListAvailable  b -> f b $ not lNoBindist
+    ListTarget     b t -> f b (lCross == t)
+    ListTag        b t -> f b (t `elem` lTag)
    where
     f b
       | b         = id
diff --git a/lib/GHCup/Command/Rm.hs b/lib/GHCup/Command/Rm.hs
--- a/lib/GHCup/Command/Rm.hs
+++ b/lib/GHCup/Command/Rm.hs
@@ -40,6 +40,7 @@
 import System.IO.Temp
 
 import qualified Data.Text as T
+import GHCup.Command.Install.LowLevel
 
 
 -- | Remove a tool completely.
@@ -143,6 +144,10 @@
       | tool == stack -> liftE $ rmStackVer ver'
       | tool == ghcup -> lift rmGhcup
       | otherwise -> fail "Could not find installed files... your DB seems corrupted"
+
+  -- now restore the X.Y symlink
+  majorMinor <- getMajorMinorV (_tvVersion tver)
+  liftE $ fixMajorMinorSymlink tool (_tvTarget tver) majorMinor
  where
   rmGHCShareDir = do
     Dirs {..}  <- getDirs
diff --git a/lib/GHCup/Input/Parsers.hs b/lib/GHCup/Input/Parsers.hs
--- a/lib/GHCup/Input/Parsers.hs
+++ b/lib/GHCup/Input/Parsers.hs
@@ -212,6 +212,7 @@
 tagEither :: String -> Either String Tag
 tagEither s' = case ls of
   "recommended"       -> Right Recommended
+  "prerelease"        -> Right Prerelease
   "latest"            -> Right Latest
   "latest-prerelease" -> Right LatestPrerelease
   "latest-nightly"    -> Right LatestNightly
@@ -279,16 +280,40 @@
   where t = T.toLower (T.pack s')
 
 criteriaParser :: String -> Either String ListCriteria
-criteriaParser s' | t == T.pack "installed"   = Right $ ListInstalled True
-                  | t == T.pack "set"         = Right $ ListSet True
-                  | t == T.pack "available"   = Right $ ListAvailable True
-                  | t == T.pack "+installed"  = Right $ ListInstalled True
-                  | t == T.pack "+set"        = Right $ ListSet True
-                  | t == T.pack "+available"  = Right $ ListAvailable True
-                  | t == T.pack "-installed"  = Right $ ListInstalled False
-                  | t == T.pack "-set"        = Right $ ListSet False
-                  | t == T.pack "-available"  = Right $ ListAvailable False
-                  | otherwise                 = Left ("Unknown criteria: " <> s')
+criteriaParser s' | t == T.pack "installed"  = Right $ ListInstalled True
+                  | t == T.pack "set"        = Right $ ListSet True
+                  | t == T.pack "available"  = Right $ ListAvailable True
+                  | t == T.pack "+installed" = Right $ ListInstalled True
+                  | t == T.pack "+set"       = Right $ ListSet True
+                  | t == T.pack "+available" = Right $ ListAvailable True
+                  | t == T.pack "-installed" = Right $ ListInstalled False
+                  | t == T.pack "-set"       = Right $ ListSet False
+                  | t == T.pack "-available" = Right $ ListAvailable False
+                  | t == T.pack "cross"      = Right $ ListTarget False Nothing
+                  | t == T.pack "-cross"     = Right $ ListTarget True Nothing
+                  | t == T.pack "+cross"     = Right $ ListTarget False Nothing
+                  | Just target <- T.stripPrefix "-target=" t = Right $ ListTarget False (Just target)
+                  | Just target <- T.stripPrefix "+target=" t = Right $ ListTarget True (Just target)
+                  | Just target <- T.stripPrefix "target=" t  = Right $ ListTarget True (Just target)
+                  | Just target <- T.stripPrefix "-target" t  = Right $ ListTarget False (Just target)
+                  | Just target <- T.stripPrefix "+target" t  = Right $ ListTarget True (Just target)
+                  | Just target <- T.stripPrefix "target" t   = Right $ ListTarget True (Just target)
+
+                  | Just tagText <- T.stripPrefix "tag=" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag
+                  | Just tagText <- T.stripPrefix "+tag=" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag
+                  | Just tagText <- T.stripPrefix "-tag=" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag False tag
+
+                  | Just tagText <- T.stripPrefix "tag" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag
+                  | Just tagText <- T.stripPrefix "+tag" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag
+                  | Just tagText <- T.stripPrefix "-tag" t
+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag False tag
+
+                  | otherwise = Left ("Unknown criteria: " <> s')
   where t = T.toLower (T.pack s')
 
 
diff --git a/lib/GHCup/Query/DB.hs b/lib/GHCup/Query/DB.hs
--- a/lib/GHCup/Query/DB.hs
+++ b/lib/GHCup/Query/DB.hs
@@ -156,6 +156,30 @@
          | tool == ghcup -> pure [] -- Hm
          | otherwise     -> pure []
 
+-- TODO: not neat the random combination of different SymlinkSpec types
+getSymlinkSpecPortable' ::
+  ( MonadReader env m
+  , HasDirs env
+  , HasPlatformReq env
+  , HasLog env
+  , MonadIOish m
+  )
+  => Tool
+  -> TargetVersion
+  -> Excepts '[ParseError] m [SymlinkSpec [Either Char Version]]
+getSymlinkSpecPortable' tool tver = do
+  runE (getSymlinkSpec' tool tver) >>= \case
+    VRight r -> pure r
+    VLeft (V pe@(ParseError _)) -> fail $ prettyHFError pe
+    VLeft _ -> do -- legacy
+      if | tool == ghc   -> do
+             pfreq <- getPlatformReq
+             liftE $ forM (defaultGHCExeSymLinked pfreq tver (ghcBinaries pfreq tver)) $ parseSymlinkSpec (_tvVersion tver)
+         | tool == cabal -> pure []
+         | tool == stack -> pure []
+         | tool == hls   -> pure []
+         | tool == ghcup -> pure [] -- Hm
+         | otherwise     -> pure []
 
 
 
diff --git a/scripts/bootstrap/bootstrap-haskell b/scripts/bootstrap/bootstrap-haskell
--- a/scripts/bootstrap/bootstrap-haskell
+++ b/scripts/bootstrap/bootstrap-haskell
@@ -41,7 +41,7 @@
 
 plat="$(uname -s)"
 arch=$(uname -m)
-ghver="0.2.6.1"
+ghver="0.2.6.2"
 : "${GHCUP_BASE_URL:=https://downloads.haskell.org/~ghcup}"
 
 export GHCUP_SKIP_UPDATE_CHECK=yes
diff --git a/test/optparse-test/InstallTest.hs b/test/optparse-test/InstallTest.hs
--- a/test/optparse-test/InstallTest.hs
+++ b/test/optparse-test/InstallTest.hs
@@ -8,8 +8,8 @@
 
 import Test.Tasty
 import GHCup.OptParse hiding (HLSCompileOptions(isolateDir))
-import Utils
 import GHCup.Types
+import Utils
 import Data.Versions
 import Data.List.NonEmpty (NonEmpty ((:|)))
 
@@ -58,10 +58,7 @@
             $(versionQ "nightly")
       )
     , ("install ghc recommended", ToolTag Recommended)
-    , ("install ghc prerelease", GHCVersion
-          $ toTargetVersionReq''
-            $(versionQ "prerelease")
-      )
+    , ("install ghc prerelease", ToolTag Prerelease)
     , ("install ghc latest-prerelease", ToolTag LatestPrerelease)
     , ("install ghc latest-nightly", ToolTag LatestNightly)
     , ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion
@@ -81,7 +78,7 @@
     , ("install cabal latest", ToolTag Latest)
     , ("install cabal nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
     , ("install cabal recommended", ToolTag Recommended)
-    , ("install cabal prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+    , ("install cabal prerelease", ToolTag Prerelease)
     , ("install cabal latest-prerelease", ToolTag LatestPrerelease)
     , ("install cabal latest-nightly", ToolTag LatestNightly)
     , ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
@@ -96,7 +93,7 @@
     , ("install hls latest", ToolTag Latest)
     , ("install hls nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
     , ("install hls recommended", ToolTag Recommended)
-    , ("install hls prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+    , ("install hls prerelease", ToolTag Prerelease)
     , ("install hls latest-prerelease", ToolTag LatestPrerelease)
     , ("install hls latest-nightly", ToolTag LatestNightly)
     , ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
@@ -111,7 +108,7 @@
     , ("install stack latest", ToolTag Latest)
     , ("install stack nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
     , ("install stack recommended", ToolTag Recommended)
-    , ("install stack prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+    , ("install stack prerelease", ToolTag Prerelease)
     , ("install stack latest-prerelease", ToolTag LatestPrerelease)
     , ("install stack latest-nightly", ToolTag LatestNightly)
     , ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
diff --git a/test/optparse-test/SetTest.hs b/test/optparse-test/SetTest.hs
--- a/test/optparse-test/SetTest.hs
+++ b/test/optparse-test/SetTest.hs
@@ -38,11 +38,7 @@
           $(versionQ "nightly")
     )
   , ("set ghc recommended", SetToolTag Recommended)
-  , ("set ghc prerelease", SetGHCVersion
-        $ (`TargetVersionReq` Nothing) $ TargetVersion
-          Nothing
-          $(versionQ "prerelease")
-    )
+  , ("set ghc prerelease", SetToolTag Prerelease)
   , ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
   , ("set ghc latest-nightly", SetToolTag LatestNightly)
   , ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
@@ -61,7 +57,7 @@
   , ("set cabal latest", SetToolTag Latest)
   , ("set cabal nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
   , ("set cabal recommended", SetToolTag Recommended)
-  , ("set cabal prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+  , ("set cabal prerelease", SetToolTag Prerelease)
   , ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
   , ("set cabal latest-nightly", SetToolTag LatestNightly)
   , ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
@@ -76,7 +72,7 @@
   , ("set hls latest", SetToolTag Latest)
   , ("set hls nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
   , ("set hls recommended", SetToolTag Recommended)
-  , ("set hls prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+  , ("set hls prerelease", SetToolTag Prerelease)
   , ("set hls latest-prerelease", SetToolTag LatestPrerelease)
   , ("set hls latest-nightly", SetToolTag LatestNightly)
   , ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
@@ -91,7 +87,7 @@
   , ("set stack latest", SetToolTag Latest)
   , ("set stack nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
   , ("set stack recommended", SetToolTag Recommended)
-  , ("set stack prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))
+  , ("set stack prerelease", SetToolTag Prerelease)
   , ("set stack latest-prerelease", SetToolTag LatestPrerelease)
   , ("set stack latest-nightly", SetToolTag LatestNightly)
   , ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
