diff --git a/Shelly/Background.hs b/Shelly/Background.hs
--- a/Shelly/Background.hs
+++ b/Shelly/Background.hs
@@ -15,7 +15,7 @@
 import Control.Concurrent
 import Control.Exception (finally, catch, throwIO, SomeException)
 import Prelude hiding (catch)
-import qualified Control.Concurrent.MSem as Sem
+import qualified Control.Concurrent.MSemN as Sem
 
 -- | Create a 'BgJobManager' that has a 'limit' on the max number of background tasks.
 -- an invocation of jobs is independent of any others, and not tied to the Sh monad in any way.
@@ -25,15 +25,11 @@
     unless (limit > 0) $ terror "expected limit to be > 0"
     availableJobsSem <- liftIO $ Sem.new limit
     res <- action $ BgJobManager availableJobsSem
-    liftIO $ waitForJobs availableJobsSem
+    liftIO $ Sem.wait availableJobsSem limit
     return res
-  where
-    waitForJobs sem = do
-      avail <- Sem.peekAvail sem
-      if avail == limit then return () else waitForJobs sem
 
 -- | The manager tracks the number of jobs. Register your 'background' jobs with it.
-newtype BgJobManager = BgJobManager (Sem.MSem Int)
+newtype BgJobManager = BgJobManager (Sem.MSemN Int)
 
 -- | Type returned by tasks run asynchronously in the background.
 newtype BgResult a = BgResult (MVar a)
@@ -55,17 +51,18 @@
     -- It is important to do this before forkIO:
     -- It ensures that that jobs will block and the program won't exit before our jobs are done
     -- On the other hand, a user might not expect 'jobs' to block
-    Sem.wait manager
+    Sem.wait manager 1
     mvar <- newEmptyMVar -- future result
 
+    -- probably should use async package rather than manually handling exception stuff
     mainTid <- myThreadId
     _<- forkIO $ do
       result <-
         finally (
-            (shelly $ (put state >> proc)) `catch`
+            shelly (put state >> proc) `catch`
               (\(e::SomeException) -> throwTo mainTid e >> throwIO e)
           )
-          (Sem.signal manager >> return ()) -- open a spot back up
+          (Sem.signal manager 1) -- open a spot back up
       putMVar mvar result
     return $ BgResult mvar
 
diff --git a/shelly-extra.cabal b/shelly-extra.cabal
--- a/shelly-extra.cabal
+++ b/shelly-extra.cabal
@@ -1,6 +1,6 @@
 Name:       shelly-extra
 
-Version:     0.2.3
+Version:     0.2.3.1
 Synopsis:    shelly features that require extra dependencies
 
 Description: A background job implementation for performing tasks in parallel.
@@ -28,7 +28,7 @@
 Library
   Exposed-modules:     Shelly.Background
 
-  Build-depends: base >= 4 && < 5, shelly >= 0.13, SafeSemaphore
+  Build-depends: base >= 4 && < 5, shelly >= 0.13, SafeSemaphore >= 0.7
 
   ghc-options: -Wall
 
