diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Revision history for greskell-websocket
 
+## 1.0.0.4  -- 2025-01-30
+
+* Fix the bug where greskell-websocket didn't work at all with `async-2.2.5`. (see https://github.com/debug-ito/greskell/pull/17 )
+* Support ghc-9.12 (base-4.21).
+
 ## 1.0.0.3  -- 2024-11-21
 
 * Confirm test with `hashtable-1.4`.
diff --git a/greskell-websocket.cabal b/greskell-websocket.cabal
--- a/greskell-websocket.cabal
+++ b/greskell-websocket.cabal
@@ -1,5 +1,5 @@
 name:                   greskell-websocket
-version:                1.0.0.3
+version:                1.0.0.4
 author:                 Toshio Ito <debug.ito@gmail.com>
 maintainer:             Toshio Ito <debug.ito@gmail.com>
 license:                BSD3
@@ -43,7 +43,7 @@
                         Network.Greskell.WebSocket.Connection.Type,
                         Network.Greskell.WebSocket.Client.Impl,
                         Network.Greskell.WebSocket.Util
-  build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0,
+  build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0 || ^>=4.21.0,
                         greskell-core ^>=1.0.0,
                         bytestring ^>=0.10.9 || ^>=0.11.3 || ^>=0.12.0,
                         base64-bytestring ^>=1.2.1,
@@ -80,7 +80,7 @@
   other-modules:        Network.Greskell.WebSocket.Codec.JSONSpec,
                         Network.Greskell.WebSocket.ResponseSpec
   build-tool-depends:   hspec-discover:hspec-discover
-  build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0,
+  build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0 || ^>=4.21.0,
                         greskell-websocket,
                         aeson ^>=2.0.2 || ^>=2.1.0 || ^>=2.2.3,
                         uuid ^>=1.3.15,
@@ -110,7 +110,7 @@
                         ServerTest.Connection,
                         ServerTest.Client
   if flag(server-test)
-    build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0,
+    build-depends:        base ^>=4.13.0 || ^>=4.14.0 || ^>=4.15.0 || ^>=4.16.0 || ^>=4.17.0 || ^>=4.18.0 || ^>=4.19.0 || ^>=4.20.0 || ^>=4.21.0,
                           greskell-websocket,
                           greskell-core ^>=1.0.0,
                           aeson ^>=2.0.2 || ^>=2.1.0 || ^>=2.2.3,
diff --git a/src/Network/Greskell/WebSocket/Connection/Impl.hs b/src/Network/Greskell/WebSocket/Connection/Impl.hs
--- a/src/Network/Greskell/WebSocket/Connection/Impl.hs
+++ b/src/Network/Greskell/WebSocket/Connection/Impl.hs
@@ -262,7 +262,7 @@
                              <|> (EvRes <$> readTQueue qres)
                              <|> makeEvActiveClose
                              <|> (rxResultToEvent <$> waitCatchSTM rx_thread)
-                             <|> (timeoutToEvent <$> waitAnySTM res_timers)
+                             <|> waitResponseTimeout res_timers
         where
           max_concurrency = Settings.concurrency settings
           cur_concurrency = length res_timers
@@ -278,6 +278,10 @@
               else do
                 conn_state <- readConnState
                 if conn_state == ConnOpen then empty else return EvActiveClose
+          waitResponseTimeout timers =
+            if null timers
+            then empty
+            else timeoutToEvent <$> waitAnySTM timers
     handleReq req = do
       insert_ok <- tryInsertToReqPool req_pool rid makeNewEntry
       if insert_ok
