diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,7 @@
 
+5.24.1
+ - The "shutdown" method of Vty handles is now idempotent (#159)
+
 5.24
  - Add Generic and NFData instances for some types
  - Image: remove custom Show instance, add derived Show and Read instances
diff --git a/src/Graphics/Vty.hs b/src/Graphics/Vty.hs
--- a/src/Graphics/Vty.hs
+++ b/src/Graphics/Vty.hs
@@ -52,6 +52,7 @@
 import Graphics.Vty.Image
 import Graphics.Vty.Attributes
 
+import Control.Monad (when)
 import Control.Concurrent.STM
 
 import Data.IORef
@@ -115,10 +116,16 @@
 intMkVty :: Input -> Output -> IO Vty
 intMkVty input out = do
     reserveDisplay out
+
+    shutdownVar <- atomically $ newTVar False
     let shutdownIo = do
-            shutdownInput input
-            releaseDisplay out
-            releaseTerminal out
+            alreadyShutdown <- atomically $ readTVar shutdownVar
+            when (not alreadyShutdown) $ do
+                atomically $ writeTVar shutdownVar True
+                shutdownInput input
+                releaseDisplay out
+                releaseTerminal out
+
     lastPicRef <- newIORef Nothing
     lastUpdateRef <- newIORef Nothing
 
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 name:                vty
-version:             5.24
+version:             5.24.1
 license:             BSD3
 license-file:        LICENSE
 author:              AUTHORS
