diff --git a/source/private/DeviceMode.m b/source/private/DeviceMode.m
index a66536f6af7a31a9bc94813cb63420cf4c898720..beaae0299598448cd9c8d6689072796b4eabdd09 100755
--- a/source/private/DeviceMode.m
+++ b/source/private/DeviceMode.m
@@ -7,45 +7,18 @@ function mode = DeviceMode(type, modeNo)
     end
     
     try
-        switch type
-            case DeviceType.NXTTouch
-                mode = DeviceMode.NXTTouch(modeNo);
-            case DeviceType.NXTLight
-                mode = DeviceMode.NXTLight(modeNo);
-            case DeviceType.NXTSound
-                mode = DeviceMode.NXTSound(modeNo);
-            case DeviceType.NXTColor
-                mode = DeviceMode.NXTColor(modeNo);
-            case DeviceType.NXTUltraSonic
-                mode = DeviceMode.NXTUltraSonic(modeNo);
-            case DeviceType.NXTTemperature
-                mode = DeviceMode.NXTTemperature(modeNo);
-            case DeviceType.LargeMotor
-                mode = DeviceMode.Motor(modeNo);
-            case DeviceType.MediumMotor
-                mode = DeviceMode.Motor(modeNo);
-            case DeviceType.Touch
-                mode = DeviceMode.Touch(modeNo);
-            case DeviceType.Color
-                mode = DeviceMode.Color(modeNo);
-            case DeviceType.UltraSonic
-                mode = DeviceMode.UltraSonic(modeNo);
-            case DeviceType.Gyro
-                mode = DeviceMode.Gyro(modeNo);
-            case DeviceType.InfraRed
-                mode = DeviceMode.InfraRed(modeNo);
-            case DeviceType.HTColor
-                mode = DeviceMode.HTColor(modeNo);
-            case DeviceType.HTCompass
-                mode = DeviceMode.HTCompass(modeNo);
-            case DeviceType.HTAccelerometer
-                mode = DeviceMode.HTAccelerometer(modeNo);
-            otherwise
-                mode = DeviceMode.Default.Undefined; % Need to think about this...
+        % Motors are a special case where the mode name does not equal the type name
+        if type == DeviceType.LargeMotor || type == DeviceType.MediumMotor
+            mode = DeviceMode.Motor(modeNo);
+        else
+            mode = DeviceMode.(char(type))(modeNo);
+        end
+    catch ME
+        if strcmp(ME.identifier,'MATLAB:undefinedVarOrClass')
+            mode = DeviceMode.Default.Undefined; % Need to think about this...
+        else
+            error('ModeNo ''%d'' not valid for given type.', modeNo);
         end
-    catch 
-        error('MATLAB:RWTHMindstormsEV3:noclass:DeviceMode:invalidInputValue',...
-              'ModeNo ''%d'' not valid for given type.', modeNo);
     end
 end
 
diff --git a/source/private/isModeValid.m b/source/private/isModeValid.m
index 1bec154a662a1d0acf7804b69014a689949fd97f..37638483673a654c555398a802cec3fcdf3df0b8 100755
--- a/source/private/isModeValid.m
+++ b/source/private/isModeValid.m
@@ -1,78 +1,11 @@
 function isValid = isModeValid(mode, type)
 % Returns whether given mode is a valid mode in given type.
-    isValid = true;
-    
     if strcmp(class(mode), 'DeviceMode.Default')
         return;
     end
-
-    switch type
-        case DeviceType.NXTTouch
-            if ~strcmp(class(mode), 'DeviceMode.NXTTouch')
-                isValid = false;
-            end
-        case DeviceType.NXTLight
-            if ~strcmp(class(mode), 'DeviceMode.NXTLight')
-                isValid = false;
-            end
-        case DeviceType.NXTSound
-            if ~strcmp(class(mode), 'DeviceMode.NXTSound')
-                isValid = false;
-            end
-        case DeviceType.NXTColor
-            if ~strcmp(class(mode), 'DeviceMode.NXTColor')
-                isValid = false;
-            end
-        case DeviceType.NXTUltraSonic
-            if ~strcmp(class(mode), 'DeviceMode.NXTUltraSonic')
-                isValid = false;
-            end
-        case DeviceType.NXTTemperature
-            if ~strcmp(class(mode), 'DeviceMode.NXTTemperature')
-                isValid = false;
-            end
-        case DeviceType.LargeMotor
-            if ~strcmp(class(mode), 'DeviceMode.Motor')
-                isValid = false;
-            end
-        case DeviceType.MediumMotor
-            if ~strcmp(class(mode), 'DeviceMode.Motor')
-                isValid = false;
-            end
-        case DeviceType.Touch
-            if ~strcmp(class(mode), 'DeviceMode.Touch')
-                isValid = false;
-            end
-        case DeviceType.Color
-            if ~strcmp(class(mode), 'DeviceMode.Color')
-                isValid = false;
-            end
-        case DeviceType.UltraSonic
-            if ~strcmp(class(mode), 'DeviceMode.UltraSonic')
-                isValid = false;
-            end
-        case DeviceType.Gyro
-            if ~strcmp(class(mode), 'DeviceMode.Gyro')
-                isValid = false;
-            end
-        case DeviceType.InfraRed
-            if ~strcmp(class(mode), 'DeviceMode.InfraRed')
-                isValid = false;
-            end
-        case DeviceType.HTColor
-            if ~strcmp(class(mode), 'DeviceMode.HTColor')
-                isValid = false;
-            end
-        case DeviceType.HTCompass
-            if ~strcmp(class(mode), 'DeviceMode.HTCompass')
-                isValid = false;
-            end
-        case DeviceType.HTAccelerometer
-            if ~strcmp(class(mode), 'DeviceMode.HTAccelerometer')
-                isValid = false;
-            end
-        otherwise
-            isValid = false;
-    end
-end
-
+    
+    % A mode is valid for a given type if the name of the type (e.g. Color)
+    % equals the name of the enumeration corresponding to the mode (e.g. Color in
+    % DeviceMode.Color.Ambient)
+    isValid = strcmp(char(type), strrep(class(mode), 'DeviceMode.', ''));
+end
\ No newline at end of file