My league does things a little differently. At the end of each season, each team is allotted a certain number of 'Contract Years' (CYs) based on where they finish in the standings. These CYs can use to sign players to various length contracts. Each year of a player contract costs one CY, and each player you keep costs you a draft pick (starting from your 1st pick). Last year teams in my league kept from 2 to 8 players, and signed players from 1 to 4 year deals. After players finish their contract, they are restricted free agents. This means that other teams may make bids on that player to sign them away from the original team. The original team has the option (if they have enough CYs) to match any offers made to free agents on their team.
Any keeper league inherently favors better teams - presumably because they have the better players to keep! One nice thing about the CY system is that it mitigates this tendency a bit by awarding more CYs to teams that finished lower in the standings. Overall, you see keeper-worthy players moving from better to worse teams. Makes it more of a challenge to stay on top, and adds a lot of strategy.
It's been a ton of fun, and keeps people active in the off-season too. Here's a link to the rules page if you are interested.