R.J.
When my DH was out of town for several months when kiddo was 3, he piled into bed with me. Then when DH came back we had the same problem.
ODDLY, what "worked" was talking to him and giving him 2 choices:
1) He could "start out" in our bed (and get moved)
or
2) He sleep in his room could climb in with us in the morning.
For us what worked best was having him start out in our bed... because it became a great motivator: Because if he "couldn't sleep in our bed" (aka stay in bed) he'd have to go to his room.
On average he started out in our room 4 nights out of 7.
But yeah. The "this is what we're going to do and here are your 2 choices" (and being solid both in that he got to choose... which fed the whole independence thing AND in "this is the way it is") worked (for us) phenom, and continues to in many areas. He might not LIKE his choices, but they are his choices to make. If he tries to not make a choice, then it becomes my choice.
How I would work it (using that template) is that he could EITHER choose to have you lay with him when he goes down OR later when he wakes up.
OR
He can choose to have a story or a song, OR you can just kiss goodnight... but you can't stay after that. If he throws a fit about you not staying then it's just the kiss on the head and go sans story or song. "I can stay for a STORY, but I can't stay to sleep, are you sure you don't want me to stay for a STORY? Or do you want me to go?"
Then when he gets up again, you just highlight that you ALREADY stayed and snuggled/read/sang.
<grinning> I just love impossible/ win-win choices. They're deliciously unfair.