diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,11 @@
+# 1.1.0.0 (2023-02-25)
+
+The `NoSuchName` constructor of `Error` now has an additional field that
+indicates which sockets are available.
+
+The `displayException` method of `Error` has been changed from the default
+implementation; it now constructs sentences.
+
 # 1.0.0.2 (2023-01-08)
 
 Support GHC 9.4
diff --git a/src/SocketActivation/Concepts.hs b/src/SocketActivation/Concepts.hs
--- a/src/SocketActivation/Concepts.hs
+++ b/src/SocketActivation/Concepts.hs
@@ -12,15 +12,20 @@
     )
     where
 
-import Control.Exception (Exception)
+import Control.Exception (Exception (..), SomeException (..))
+import Data.Functor ((<$>))
+import Data.Function ((.))
+import Data.Semigroup ((<>))
 import Data.String (IsString)
 import Data.Text (Text)
-import Numeric.Natural (Natural)
-import Prelude (Bounded, Enum, Eq, Ord, Show)
-
+import Data.Typeable (cast)
 import Network.Socket (Socket)
+import Numeric.Natural (Natural)
+import Prelude (Bounded, Enum, Eq, Ord, Show, String, show)
 import System.Posix.Types (Fd (..), ProcessID)
 
+import qualified Data.Text as Text
+
 {-| The ID of the process to whom systemd has given the sockets
 
 A process should not use sockets that are intended for someone else, so we
@@ -47,6 +52,52 @@
 data VarName = LISTEN_PID | LISTEN_FDS | LISTEN_FDNAMES
     deriving stock (Eq, Show, Enum, Bounded)
 
-data Error = Missing VarName | Invalid VarName | WrongProcess | NoSuchName Name
+data Error =
+    Missing VarName
+  | Invalid VarName
+  | WrongProcess
+  | NoSuchName Name [Name]
     deriving stock Show
-    deriving anyclass Exception
+
+instance Exception Error where
+    fromException (SomeException e) = cast e
+    toException = SomeException
+    displayException = \case
+        Missing v -> unwords
+            [ "The environment variable"
+            , tshow @VarName v
+            , "is required but not present."
+            ]
+        Invalid v -> unwords
+            [ "The environment variable"
+            , tshow @VarName v
+            , "has a malformed value that could not be parsed."
+            ]
+        WrongProcess -> unwords
+            [ "A socket is present, but it was rejected because"
+            , tshow @VarName LISTEN_PID
+            , "differs from the current process ID."
+            ]
+        NoSuchName wanted found -> unwords
+            [ "Cannot find a socket named"
+            , quote (nameText wanted) <> "."
+            , case found of
+                [] -> "There are no available sockets."
+                [x] -> Text.unwords
+                    [ "This is one available socket and its name is"
+                    , quote (nameText x) <> "."
+                    ]
+                xs -> Text.unwords
+                    [ "The available sockets are:"
+                    , Text.intercalate ", " (nameText <$> xs) <> "."
+                    ]
+            ]
+
+quote :: Text -> Text
+quote x = "‘" <> x <> "’"
+
+tshow :: forall a. Show a => a -> Text
+tshow = Text.pack . show
+
+unwords :: [Text] -> String
+unwords = Text.unpack . Text.unwords
diff --git a/src/SocketActivation/GetByName.hs b/src/SocketActivation/GetByName.hs
--- a/src/SocketActivation/GetByName.hs
+++ b/src/SocketActivation/GetByName.hs
@@ -45,5 +45,5 @@
 getSocketByName name = run (getMap >>= findFd >>= convertToSocket)
   where
     getMap = IO' getFileDescriptorMap
-    findFd = maybe (throwError (NoSuchName name)) return . Map.lookup name
+    findFd m = maybe (throwError (NoSuchName name (Map.keys m))) return (Map.lookup name m)
     convertToSocket = liftIO . fdSocket
diff --git a/systemd-socket-activation.cabal b/systemd-socket-activation.cabal
--- a/systemd-socket-activation.cabal
+++ b/systemd-socket-activation.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 
 name: systemd-socket-activation
-version: 1.0.0.2
+version: 1.1.0.0
 category: System, Network
 synopsis: Let systemd bind the server's socket for you
 
@@ -24,8 +24,8 @@
 extra-source-files: *.md
 
 source-repository head
-  type: git
-  location: https://github.com/typeclasses/systemd-socket-activation
+    type: git
+    location: https://github.com/typeclasses/systemd-socket-activation
 
 library
     default-language: Haskell2010
@@ -33,8 +33,9 @@
     hs-source-dirs: src
 
     default-extensions: DeriveAnyClass DerivingStrategies
-        DerivingVia GeneralizedNewtypeDeriving
-        NoImplicitPrelude OverloadedStrings TypeApplications
+        DerivingVia LambdaCase GeneralizedNewtypeDeriving
+        NoImplicitPrelude OverloadedStrings
+        ScopedTypeVariables TypeApplications
 
     exposed-modules:
         SocketActivation
