Вопрос: Стоит ли использовать здесь перечисления?

Лучший ответ: Стоит, так будет удобнее и понятнее.
namespace TryEnum
{
    enum DownloadType
    {
        Video, Audio, Custom, Unknown, Default
    }
    enum ForceIpProtocol
    {
        IPv4, IPv6
    }
    enum ProxyProtocol
    {
        HTTPS, HTTP, SOCKS4, SOCKS5
    }
}

А использовать вот так:


А по поводу интерфейсов... Интерфейсы не должны быть вместо классов; класс реализует интерфейс (выглядит синтаксис как наследование class ClassName : IClassName, но это не совсем наследование, там немножко другая реализация). И интерфейс нужен в том случае, если нужно реализовать полиморфизм в коде и/или что бы упростить доступ к публичным полям в классах, которые реализуют этот интерфейс. 
Например: у нас есть много классов с разными реализациями, но их всех объединяют одни и те же свойства (к приеру свойства  public string Name ( get; set; );  public int Age( get; set; ); и тд...). Интерфейс в данном случае нужен для того, что бы через него мы получали доступ ко множественному поведению, при помощи разных классов, содержащих одноименные свойства, не плодя при этом код.

Для наглядности:

у нас есть метод Create(); в котором мы хотим создавать новых людей

static void Create()
        {
            // empty...
        }

Есть разные классы, которые создают Human и реализуют интерфейс IHuman

class SimpleHuman : IHuman
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public SimpleHuman()
        {
            Name = "Generic human...";
            Age = 20;
        }
        public SimpleHuman(string name) : this()
        {
            Name = name;
        }
        public SimpleHuman(string name, int age) : this()
        {
            Name = name;
            Age = age;
        }
    }

class CoolHuman : IHuman
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public CoolHuman()
        {
            Name = "BOB!";
            Age = 20;
        }
        public CoolHuman(string name) : this()
        {
            Name = name;
        }
        public CoolHuman(string name, int age) : this()
        {
            Name = name;
            Age = age;
        }
    }

interface IHuman
    {
        string Name { get; set; }
        int Age { get; set; }
    }

И теперь, благодаря реализации интерфейса в этих классах мы можем удобно использовать этот самый интерфейс, например:
class Create
    {
        public IHuman Human { get; set; }
        public Create()
        {
            Human = new CoolHuman();
        }
        public void Hello()
        {
            Console.WriteLine("Hello, {0}. Today you are {1} years old", Human.Name, Human.Age);
        }
    }

Конкретно в вашем случае интерфес не нужен.

Худший ответ: программирование интересная штука - работает? не трогай!Мне кажется, что вместо классов здесь должны быть интерфейсы?в тексте вопросаСтоит ли использовать здесь перечисления?вы уж определитесь в хотелках:
- перечисления?
- интерфейсы?
- и то и другое?
.. а зачем? (с) из хорошего анекдота
а мораль простая - если понимаете зачем? выпиливайте, тестируйте, пользуйтесь!

ps со стороны, все это невозможно оценить без детально расписанных сценариев использования