Forcément, tu n'as même pas mis de double-checked lock

(Ça à toujours été valide en .NET sur x86 contrairement à Java, mais le modèle mémoire de .NET à été un peu renforcé pour que ça marche partout ailleurs)
Mais en C#, le mieux reste
class Truc
{
public static readonly Truc = new Truc();
private Truc() { }
}
Pour les classes légères. (Pour les classes "lourdes", il vaut sans doute mieux inclure un constructeur statique vide)
Bien sûr, s'il y a d'autres membres statiques à initialiser il faut adapter. (Par exemple placer le singleton dans sa propre classe privée imbriquée)
Tu as une garantie forte offerte par le CLR là dessus (initialisation unique, sauf exception déclenchée dans le constructeur statique), et c'est potentiellement plus efficace.
Sinon, tu as aussi Lazy<T> en 4.0, ça fonctionne un peu différemment, mais je n'en ai jamais eu l'utilité, donc je ne peux pas en dire plus
