They are useful in any situation when you want cleanup code to be called on an object deterministically and regardless of exceptions (since a using statement is really just a try/finally).
Most often they are used to clean up unmanaged resources but you can use them however you see fit.