I keep mixing it up between heap and stack, so this post is more of a reminder for me.
Value types go in one container and Reference types go in the other.
Typically value types go into the Stack and reference types go onto the Heap.
Why do I say typically? Because value types that are declared as part of a reference type (members) are stored on the heap.
A more specific rule:
Reference types are always allocated on the Heap.
Value types and pointers are allocated on the Stack if they were defined within a method. But if they (value types and pointers) were declared as member variables of a class (a reference type), then they get allocated on the Heap.
Here is a good article that touches on these issues and more: Heaping vs. Stacking