Em C #, uso de tipos de valor vs. tipos de referência

Minhas perguntas são:

Quando devemos usar tipos de valor e quando tipos de referência?Quais são as vantagens e desvantagens de um sobre o outro?E se alguém usar tipos de referência em todos os lugares? Existe algum mal nisso?

Por favor, discuta também as vantagens e desvantagens de cada um. Eu quero entender isso também.