The way I usually think about it is that it's like the Rust borrowing system but more powerful. If the compiler can be sure a type will be used exactly once, you could for example do automatic memory management by freeing the value directly after it is used. You can also fix a range of multithreading bugs with it, as other people have mentioned.
Finally, it allows you to express more invariants about your data through the type system, hopefully reducing bug counts. As an example, soneone could "implement" a sorting function as `sort xs = []`. This has the correct type signature, but is not a correct implementation of sorting. With linear types you could express that the output has to access the values of the input. (Of course what we'd actually want is to express other invariants for sorting as well, but full dependent types are still some ways off)