The TLF gives a detailed history of the pronunciation of the word fils, including the reasons why the s is pronounced nowadays.
We must first remember that from the 12th to the 16th centuries, the final s gradually disappeared before a consonant, but was still pronounced as a voiced [z] before a vowel and as a voiceless [s] at the end of a word. From the 18th century onwards, it disappeared at the end of words, surviving only in the case of close liaison before a vowel (in the form of [z]). It is very regularly pronounced [fi] in un fils or dans le fils prodigue. The restoration of the s in this type of word (fils, ours) dates from the 18th century. In the case of fils, this can be explained by the affective pronunciation of a word often used in the vocative case. The old 17th-century pronunciation [fi] is still recommended when the word does not end the sentence (so before a consonant in the middle of a sentence: votre fils nous a déçus [finuzadesy]), which is in agreement with the old system where s is voiced before a vowel, unvoiced at a pause, but disappears before a consonant in a sentence. But according to Littré, the habit of pronouncing [fis] at a pause as well as before a consonant is not correct. After Littré, the pronunciation [fi] is considered outdated. It has remained longer (although it has also disappeared there today) in religious expressions such as au nom du fils or le fils de l'homme. The word appears accepted in the first edition of the Dictionnaire de l'Académie française. The fifth edition (1798-1878) states that the l is not pronounced and the eighth edition adds that the s is pronounced¹.
Other singular nouns ending with s and where the s is pronounced I can think of are: ours, os (but for this one the plural is [ɔ]), sens, bus, as and probably a few others. You can also have a look at this question.
¹. My translation.