I solve this by quoting a price between $xx and $xx, taking 50% of the smaller amount and then if the job takes longer than I estimated I have some room to charge more at the end.
I've just learnt through experience. There is obviously still some risk involved but it's reduced. When I'm working on projects that are similar to ones I've worked on before I use a smaller price range and if I'm working on something totally new to me I will use a larger price range to keep the risk as minimal as I can.
That's an interesting approach, but in fact your range is a time estimate, so it's not quite true that you've stopped doing time estimates, it's just you've stopped telling the cusetomer exactly what they are.