My vote goes with always using an auction draft, which establishes a salary for that player. That player can be kept for 1 year at that auction price, and then you must decide if you're going to keep that player for ONE more year at that original auction price and lose him no matter what after the following season (even if he's traded to another team, he's still going back in the pool, salary/contract is traded)
OR after that first year kept at auction price, you can offer a player a "Long Term Contract" which in most leagues has a minimum (usually 2 years) or maximum (3 to 4 years) If this route is used, the players contract goes up X each year (Usually $5 in a 260 budget league)
If you cut or drop a player that is under a Long Term Contract, you pay half the remaining balance of the contract by losing that amount in the following years draft.
This makes it so bidding small amount on up and coming players is worthwhile, but yet, you still have hard decisions to make when it comes to offering Long Term Contracts.
We've used this set up in my AL Only keeper for years, and can keep UP TO 10. Works great.