Q:

could have - must have - may have - might have

Why is John late?  

He could have got stuck in traffic.
  He must have been stuck.
  He may have been stuck.
  He might have been stuck.  

Are there any differences (even subtle) between these answers ? 

A:

He could have got stuck in traffic.

An action he took in the past resulted in the possibility of him getting stuck in traffic in the past.  
Since this possibility has passed, it ended up that he did not get stuck in traffic.  Otherwise we would say "He did get stuck in traffic."
E.g. Why is Bobby late?  Forgive him, he could have been stuck in the rain.
It also can be used in the same way as "might have been" below.

He must have been stuck.

Something happened X, and the only reason that explains it is the fact that he had been stuck.  X refers to something that is completed or completely in the past.  E.g. Bobby was late because he must have been stuck in the rain. (Bobby is here now)

He may have been stuck.

Something happened X, and a possible reason that explains it is the fact that he had been stuck.  Other reasons for him being stuck are possible.  X refers to something that may have started in the past but is happening now.  E.g. Bobby is not here, he may have been stuck in the rain.   (We are still hoping he makes it)

He might have been stuck.

Something happened, and a possible reason that explains it is the fact that he had been stuck.  Other reasons for him being stuck are possible.  X refers to something that is completed or completely in the past.  E.g. Bobby hasn't called.  He might have been stuck in the rain.  (Implication is that we don't expect him to show up)

