diff --git a/Acme/Missiles.hs b/Acme/Missiles.hs
--- a/Acme/Missiles.hs
+++ b/Acme/Missiles.hs
@@ -11,62 +11,8 @@
 
 module Acme.Missiles (
     launchMissiles,
-
-    -- * Launching missiles in the 'STM' monad
-    withMissilesDo,
-    launchMissilesSTM,
 ) where
 
-import Control.Concurrent
-import Control.Concurrent.STM
-import Control.Exception (bracket)
-import Control.Monad (forever)
-import System.IO.Unsafe (unsafePerformIO)
-
 -- | Cause serious international side effects.
 launchMissiles :: IO ()
 launchMissiles = putStrLn "Nuclear launch detected."
-
--- | Perform initialization needed to launch missiles in the 'STM' monad.
-withMissilesDo :: IO a -> IO a
-withMissilesDo action =
-        bracket (forkIO doLaunching)
-                killThread
-                (\_ -> action)
-    where
-        doLaunching = forever $ do
-            atomically $ do
-                n <- readTVar missileCommand
-                if n > 0
-                    then writeTVar missileCommand (n - 1)
-                    else retry
-            launchMissiles
-
--- | Launch missiles within an 'STM' computation.  Even if the memory
--- transaction is retried, only one salvo of missiles will be launched.
---
--- Example:
---
--- >import Acme.Missiles
--- >import Control.Concurrent
--- >import Control.Concurrent.STM
--- >
--- >main :: IO ()
--- >main = withMissilesDo $ do
--- >    xv <- atomically $ newTVar (2 :: Int)
--- >    yv <- atomically $ newTVar (1 :: Int)
--- >    atomically $ do
--- >        x <- readTVar xv
--- >        y <- readTVar yv
--- >        if x > y
--- >            then launchMissilesSTM
--- >            else return ()
--- >    threadDelay 100000
-launchMissilesSTM :: STM ()
-launchMissilesSTM = do
-    n <- readTVar missileCommand
-    writeTVar missileCommand $! n + 1
-
-missileCommand :: TVar Integer
-{-# NOINLINE missileCommand #-}
-missileCommand = unsafePerformIO (newTVarIO 0)
diff --git a/Acme/Missiles/STM.hs b/Acme/Missiles/STM.hs
new file mode 100644
--- /dev/null
+++ b/Acme/Missiles/STM.hs
@@ -0,0 +1,58 @@
+module Acme.Missiles.STM (
+    -- * Launching missiles in the 'STM' monad
+    withMissilesDo,
+    launchMissilesSTM,
+) where
+
+import Acme.Missiles (launchMissiles)
+
+import Control.Concurrent       (forkIO, killThread)
+import Control.Concurrent.STM   (STM, atomically, retry,
+                                 TVar, newTVarIO, readTVar, writeTVar)
+import Control.Exception        (bracket)
+import Control.Monad            (forever)
+import System.IO.Unsafe         (unsafePerformIO)
+
+-- | Perform initialization needed to launch missiles in the 'STM' monad.
+withMissilesDo :: IO a -> IO a
+withMissilesDo action =
+        bracket (forkIO doLaunching)
+                killThread
+                (\_ -> action)
+    where
+        doLaunching = forever $ do
+            atomically $ do
+                n <- readTVar missileCommand
+                if n > 0
+                    then writeTVar missileCommand (n - 1)
+                    else retry
+            launchMissiles
+
+-- | Launch missiles within an 'STM' computation.  Even if the memory
+-- transaction is retried, only one salvo of missiles will be launched.
+--
+-- Example:
+--
+-- >import Acme.Missiles
+-- >import Control.Concurrent
+-- >import Control.Concurrent.STM
+-- >
+-- >main :: IO ()
+-- >main = withMissilesDo $ do
+-- >    xv <- atomically $ newTVar (2 :: Int)
+-- >    yv <- atomically $ newTVar (1 :: Int)
+-- >    atomically $ do
+-- >        x <- readTVar xv
+-- >        y <- readTVar yv
+-- >        if x > y
+-- >            then launchMissilesSTM
+-- >            else return ()
+-- >    threadDelay 100000
+launchMissilesSTM :: STM ()
+launchMissilesSTM = do
+    n <- readTVar missileCommand
+    writeTVar missileCommand $! n + 1
+
+missileCommand :: TVar Integer
+{-# NOINLINE missileCommand #-}
+missileCommand = unsafePerformIO (newTVarIO 0)
diff --git a/acme-missiles.cabal b/acme-missiles.cabal
--- a/acme-missiles.cabal
+++ b/acme-missiles.cabal
@@ -1,5 +1,5 @@
 name:                acme-missiles
-version:             0.2.1
+version:             0.3
 synopsis:            Cause serious international side effects.
 description:
     The highly effectful 'launchMissiles' action, as mentioned in /Beautiful concurrency/,
@@ -7,12 +7,12 @@
 license:             PublicDomain
 author:              Joey Adams
 maintainer:          joeyadams3.14159@gmail.com
--- copyright:           
 category:            Acme
 build-type:          Simple
 cabal-version:       >=1.8
 
 library
   exposed-modules:     Acme.Missiles
+                       Acme.Missiles.STM
   build-depends:       base >= 3 && < 5, stm
   ghc-options:         -Wall
