"on" is a nice way to avoid repetition
Compose sum with weight rather than dropping down to foldl
Decoupling the knapsack algorithm from the Item type.
Removing a couple of type aliases. They're no longer pulling their weight.
Okay Haskell, you got me. I'm going to use one of your goddamned infix operators.
Minor tweaks.
Whitespace changes.
Eliminate Costed typeclass

Imagine that songs have both prices and durations, so you might want to
knapsack them by duration into a time limit, or instead pack them by
price into a total budget.

Using a Costed typeclass for this, you're limited to a single instance
of Costed per module, which is a code smell. The solution is to simply
parameterise knapsack on the costing function, so that the Costed
typeclass becomes a regular type.