As you may have noticed there are more pool hoppers these days, and tools for pool hopping. Therefore moving away from proportional payouts seems prudent. Of course we won't switch in the middle of a block, and the new system will take a bit of time to implement, but it's probably a good idea to switch soon.
Of all the payout systems people have thought of so far I believe PPLNS is the best. It's a good combination of fair payouts and not letting the pool become bankrupt or end up in some other situation where miners leave.
Basically PPLNS (pay-per-last-N-shares) works like this:
payout = blockvalue * your shares among the last N shares / N
The people over at Eligius have a write-up on PPLNS with more details here: http://eligius.st/wiki/index.php/Pay_Per_Last_N_Shares
As for the question of how to determine N, I think N = 2 * difficulty might make most sense. In that case many shares will get paid twice. If choosing N = difficulty / 2 then many shares aren't paid at all. I think people will be more comfortable with most shares being paid 2 times, instead of 0-1 times.
One issue I have with PPLNS is the idea of storing million after million of individual shares in the database. This could become a bottleneck as the pool grows larger. It could also limit running statistics, and I would like to have a lot of statistics.
An idea I have to limit the load on the server is to group shares into "shifts" and pay per shifts. Just like some people work night and day shifts. Every time we have, say, a number of shares equal to 20% of the difficulty, that is stored away as a shift, and we begin on a new one. Whenever a block is found, the last 10 shifts are paid. This way the server only handles a handful of numbers instead of millions to display statistics.
It would be possible to pay the last 10 complete shifts, or the last 10 shifts + the current (incomplete) shift. Paying the current shift would make share payments vary in value with how complete the current shift is. This might make the system slightly hoppable. Not paying the current shift might feel unfair to some, though, especially as you might solve a block and not even get paid 1 share, if you don't have any shares in existing shifts.
It would also be possible to pay for last N hours, for instance last 12 hours. But I think this is a bad idea at least while the pool is small. If it takes a week to find a block, paying only the last 12 hours means a lot of shares aren't paid. And if we pay all shares from the last 7 days, then it gets out of hand when the pool gets larger.