diff --git a/Test/Tasty/Parallel.hs b/Test/Tasty/Parallel.hs
--- a/Test/Tasty/Parallel.hs
+++ b/Test/Tasty/Parallel.hs
@@ -5,6 +5,7 @@
 import Control.Concurrent
 import Control.Concurrent.STM
 import Control.Exception
+import Foreign.StablePtr
 
 -- | Take a list of actions and execute them in parallel, no more than @n@
 -- at the same time
@@ -20,6 +21,13 @@
 -- threads are by definition unexpected.
 runInParallel nthreads actions = do
   callingThread <- myThreadId
+
+  -- Don't let the main thread be garbage-collected
+  -- Otherwise we may get a "thread blocked indefinitely in an STM
+  -- transaction" exception when a child thread is blocked and GC'd.
+  -- (See e.g. https://github.com/feuerbach/tasty/issues/15)
+  _ <- newStablePtr callingThread
+
   -- A variable containing all ThreadIds of forked threads.
   --
   -- These are the threads we'll need to kill if something wrong happens.
diff --git a/tasty.cabal b/tasty.cabal
--- a/tasty.cabal
+++ b/tasty.cabal
@@ -2,7 +2,7 @@
 --  see http://haskell.org/cabal/users-guide/
 
 name:                tasty
-version:             0.2
+version:             0.3
 synopsis:            Modern and extensible testing framework
 description:         See <http://documentup.com/feuerbach/tasty>
 license:             MIT
@@ -39,10 +39,10 @@
     Test.Tasty.UI
   build-depends:
     base ==4.*,
-    stm,
+    stm >= 2.3,
     containers,
     mtl,
-    tagged,
+    tagged >= 0.5,
     regex-posix,
     optparse-applicative >= 0.5
 
