My mantra is - never assume features, but always assume change. As others have mentioned - it's orders of magnitude easier to add a layer of abstraction to a simple system as requirements evolve, than it is to remove an unneeded one down the line. The latter is often impossible.
I rarely, if ever see this done. Probably because it takes a big risk as an engineer to actually do it.