diff --git a/src/Control/Concurrent/STM/TBChan.hs b/src/Control/Concurrent/STM/TBChan.hs
--- a/src/Control/Concurrent/STM/TBChan.hs
+++ b/src/Control/Concurrent/STM/TBChan.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fwarn-tabs #-}
 {-# LANGUAGE CPP, DeriveDataTypeable #-}
 ----------------------------------------------------------------
---                                                    2011.04.03
+--                                                    2011.04.05
 -- |
 -- Module      :  Control.Concurrent.STM.TBChan
 -- Copyright   :  Copyright (c) 2011 wren ng thornton
@@ -28,6 +28,7 @@
     , tryPeekTBChan
     -- ** Writing to TBChans
     , writeTBChan
+    , tryWriteTBChan
     , unGetTBChan
     -- ** Predicates
     , isEmptyTBChan
@@ -117,6 +118,19 @@
         else do
             writeTChan chan x
             modifyTVar' limit (subtract 1)
+
+
+-- | A version of 'writeTBChan' which does not retry. Returns @True@
+-- if the value was successfully written, and @False@ otherwise.
+tryWriteTBChan :: TBChan a -> a -> STM Bool
+tryWriteTBChan self@(TBChan limit chan) x = do
+    b <- isFullTBChan self
+    if b
+        then return False
+        else do
+            writeTChan chan x
+            modifyTVar' limit (subtract 1)
+            return True
 
 
 -- | Put a data item back onto a channel, where it will be the next
diff --git a/src/Control/Concurrent/STM/TBMChan.hs b/src/Control/Concurrent/STM/TBMChan.hs
--- a/src/Control/Concurrent/STM/TBMChan.hs
+++ b/src/Control/Concurrent/STM/TBMChan.hs
@@ -1,7 +1,7 @@
 {-# OPTIONS_GHC -Wall -fwarn-tabs #-}
 {-# LANGUAGE CPP, DeriveDataTypeable #-}
 ----------------------------------------------------------------
---                                                    2011.04.03
+--                                                    2011.04.05
 -- |
 -- Module      :  Control.Concurrent.STM.TBMChan
 -- Copyright   :  Copyright (c) 2011 wren ng thornton
@@ -29,6 +29,7 @@
     , tryPeekTBMChan
     -- ** Writing to TBMChans
     , writeTBMChan
+    , tryWriteTBMChan
     , unGetTBMChan
     -- ** Closing TBMChans
     , closeTBMChan
@@ -154,6 +155,25 @@
                 else do
                     writeTChan chan x
                     modifyTVar' limit (subtract 1)
+
+
+-- | A version of 'writeTBMChan' which does not retry. Returns @Just
+-- True@ if the value was successfully written, @Just False@ if it
+-- could not be written (but the channel was open), and @Nothing@
+-- if it was discarded (i.e., the channel was closed).
+tryWriteTBMChan :: TBMChan a -> a -> STM (Maybe Bool)
+tryWriteTBMChan self@(TBMChan closed limit chan) x = do
+    b <- readTVar closed
+    if b
+        then return Nothing
+        else do
+            b' <- isFullTBMChan self
+            if b'
+                then return (Just False)
+                else do
+                    writeTChan chan x
+                    modifyTVar' limit (subtract 1)
+                    return (Just True)
 
 
 -- | Put a data item back onto a channel, where it will be the next
diff --git a/stm-chans.cabal b/stm-chans.cabal
--- a/stm-chans.cabal
+++ b/stm-chans.cabal
@@ -1,9 +1,9 @@
 ----------------------------------------------------------------
--- wren ng thornton <wren@community.haskell.org>    ~ 2011.04.03
+-- wren ng thornton <wren@community.haskell.org>    ~ 2011.04.05
 ----------------------------------------------------------------
 
 Name:           stm-chans
-Version:        1.0.0
+Version:        1.1.0
 -- Source-Repository requires version 1.6
 Cabal-Version:  >= 1.6
 -- We need a custom build in order to define __HADDOCK__
@@ -15,7 +15,7 @@
 Author:         wren ng thornton
 Maintainer:     wren@community.haskell.org
 Homepage:       http://code.haskell.org/~wren/
-Category:       System
+Category:       Concurrency
 Synopsis:       Additional types of channels for STM.
 Description:    Additional types of channels for STM.
 
