I'm asking this about smaller jobs: I think that with larger jobs you have all kinds of contractual issues to deal with. With larger jobs, if you haven't contemplated schedule slippage, you're basically hosed.
With smaller deliverables (10 hours or less): If you're doing something you've done before, it's very easy to estimate the time the job will take (and it may take less, since you've already learned how to do it "best"). But with something new, how do you deal with possible time slippage in your initial estimates? Arbitrarily add 20% to the time, just in case? Give a range and then give more precision as you move ahead? Do some HelloWorlds billing a few hours and try to figure out the unknowns?
I'm assuming, for this question, that you work for a flexible client who needs to have the best information possible to do their job, and needs everything sooner than later.