Thanks, that is a really good answer.
Regarding point 1), it's difficult to spend enough time up-front working through requirements to estimate, reviewing with client etc - for 2-3 days work can take 4+ hours. Heck, I won't know all unknowns until I program it, and often feel I might as well have built a prototype in this time (and saved the client half a day's money). Plus, if the work doesn't come off, that's a lot of time wasted.
The project that triggered this post is making a 7-screen online copy of a 6-page paper form. It should be straightforward, and as with many of these projects the client expects it to be cheap because it's "simple" - so we have a bad expectation to start with. I made a couple of judgement errors when quoting (mostly on conditional logic, which the paper form didn't include: dynamic add/remove of form rows), and now when viewing the first draft the client's decided that additional show/hide regions and conditional validation are required, and some fields to be modified from the paper form because "They'll be better like that". We'd had a face to face meeting before the project began so I thought I knew what the client wanted and the client was happy with what I proposed...
I do think the fault is mine. I'm sick of my projects ending up with bad feeling on both sides. You are spot on that some clients just don't want to pay for the work involved; I have one that quibbles over every 20 minute period on the invoice, saying it could be done quicker. But then when the quote is squeezed to give a good fixed-price, a lot of modifications/changes get left out, and the client isn't happy then.