See https://gist.github.com/gavinandresen/6548612 for complete design; executive summary:
This removes use of hard-coded fee constants for non-miners. Instead, fees are estimated based on transactions that recently left the memory pool because they were accepted into a block.
Pull-requesting this to get code review; I'll be working on a test plan next. @sipa suggested the estimate would be better if we looked at transactions that languished in the memory pool, instead; I think that would best be accomplished by implementing a memory-limited memory pool, and keeping track of priority/fee for transactions that get evicted from the pool because it was full. In any case, we will probably get a better estimate of miner's behavior by looking at both transactions that are accepted into blocks AND transactions that don't.