ATC and late instructions to climb

ATC has been improved lately however I do get a bit irritated with its altitude instructions. Say I’m flying a two hour route in a GA plane. ATC will initially set an altitude of something like 3000’ and leave you there for over an hour before you’re nearing the approach and then send you up to say 9000’ before then telling you to descend back to 2500’ to complete the flight. Why can’t they send you up to 9000’ straight away so you can benefit from better fuel efficiency?

You could have requested that in the ATC dialogue.

Surely the request only affects the final cruise altitude, not interim altitude holds?

At some point that option disappears, but I have used it to both raise, and lower my altitude. I’m not sure what the trigger is to remove it, presumably one of the frequency changes.